mid函数相关知识
-
爬取链家数据,用气泡图分析武汉市二手房价格本文是Excel气泡图应用的实践案例,通过气泡图对房地产数据分析的应用,让大家了解气泡图的适用场景,以及发现一些数据的特征。收集链家二手房数据利用gooseeker的在线快捷爬数据应用——数据DIY,抓取链家上武汉的二手房列表数据,一共爬到300条数据,把它作为样本,简单分析一下房产价格的影响因素。数据DIY地址数据处理对房屋信息一列用Excel的分列功能,清洗出户型、面积、朝向、装修、电梯情况这4类信息。对位置信息这列用分列功能,把建筑年代单独作为一列,再用mid函数提取出年代数值,最后用减法算出楼龄。最后要把文本格式的数据转为数值格式,后面画图需要用到。关于气泡图Excel的图表中大部分都只能展示两组变量之间的关系,即(x,y)数据点的分布,而气泡图则可以呈现三组变量之间的相互关系,即除了横坐标和纵坐标上的两个变量外,还可以通过气泡的大小变化来表达第三个变量的变化情况。在《爬取链家数据,用散点图分析武汉市二手房价格》一文中已经介绍了散点图的作用及制作方法,其实可以把气泡图归纳为散点图中的一种,只是气泡图
-
Mysql中实现提取字符串中的数字的自定义函数分享因需要在mysql的数据表中某一字符串中的字段提取出数字,在网上找了一通,终于找到了一个可用的mysql函数,可以有效的从字符串中提取出数字。该mysql提取出字符串中的数字函数如下:复制代码 代码如下:CREATE FUNCTION GetNum (Varstring varchar(50))RETURNS varchar(30)BEGINDECLARE v_length INT DEFAULT 0;DECLARE v_Tmp varchar(50) default '';set v_length=CHAR_LENGTH(Varstring);WHILE v_length > 0 DOIF (ASCII(mid(Varstring,v_length,1))>47 and ASCII(mid(Varstring,v_length,1))<58 ) THENset v_Tmp=concat(v_Tmp,mid(Varstring,v_length,1)
-
剑指offer-数字在排序数组中出现的次数统计一个数字在排序数组中出现的次数。既然是有序数组,采用二分查找的思路,先找到目标值所在位置,然后遍历目标值左右的数字,统计目标值出现的次数。 function GetNumberOfK(data, k) { // write code here if(data.length==0) return 0; //由于数组是有序的 所以利用二分查找 var left=0; var right=data.length-1; var count=0; var mid; while(left<=right){ mid=Math.floor((left+right)/2); if(k>=data[mid]){ left=mid+1; } else{ right=mid-1; } } var
-
iOS总结笔记 快速排序 、二分查找的OC实现//二分查找 默认查找有序数组 - (NSInteger)searchTarget:(NSInteger)target fromArr:(NSArray *)arr { if (arr.count < 1) { return -1; } NSInteger start,mid,end; start = 0; mid = 0 ; end = arr.count-1; while (start < end-1) {//就剩两个数的时候 start = end - 1;这个条件跳出 mid = start + (end - start)/2; if ([arr[mid] integerValue] > target) { end = mid; }else{ start = mid; } } if (target == [arr[start]
mid函数相关课程
-
PHP函数篇 本教程结合实例形式分析了PHP关于自定义函数的创建、返回值、默认值、参数、值传递、作用域 以及可变函数、嵌套函数、递归函数、闭包函数的使用等相关技巧。
讲师:顾金鹤 入门 22630人正在学习
-
JAVA 函数式编程 本课程以 Java 11 为编译环境,讲解了 Java 对函数式编程支持,以及用实战小例子演示如何使用函数式简洁优雅的直击问题核心逻辑。另,老师新作 《Spring Security+OAuth2 精讲 多场景打造企业级认证与授权》https://coding.imooc.com/class/455.html 也上线啦,课程中将结合前后端分离的权限管理应用,基于从单体到微服务的演进,精讲主流安全框架 Spring Security5.x 的核心技术,一站式覆盖目前企业主流认证授权的方方面面,感兴趣的同学,可以关注一下,欢迎撒花拍砖~~
讲师:接灰的电子产品 初级 10811人正在学习
mid函数相关教程
- 1.2 具体实现代码(递推实现) fun main() { println(binarySearch(intArrayOf(1, 3, 5, 7, 9, 11), 5))}fun binarySearch(numberArray: IntArray, targetNum: Int): Int { var low = 0 var high = numberArray.size - 1 while (low <= high) { var mid = (low + high) ushr 1// ushr表示Kotlin中的中缀调用函数相当于Java中无符号右移位运算符>>> when { targetNum == numberArray[mid] -> return mid targetNum > numberArray[mid] -> low = mid + 1 else -> high = mid - 1 } } return -1}
- 1. 连续数列 首先看题目,这是 leetcode 中的面试题部分,题目内容如下:给定一个整数数组,找出总和最大的连续数列,并返回总和。示例:输入: [-2,1,-3,4,-1,2,1,-5,4]输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。进阶:如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。这个很明显是一道动态规划问题,而且使用动态规划方法的时间复杂度为 O(n)O(n)O(n),空间复杂度可以优化为 O(1)O(1)O(1)。题目描述中已经说明了可以使用分治法去求解该问题。那我们就要思考,如何分解问题,如何合并子问题的解。首先定义解决该问题的方法:def divide(nums, left, right): """ 返回nums[left:right+1]总和最大的连续数列 """ pass分解终止条件当数组为空时,我们就可以停止分解了,转而合并结果:if left == right: return nums[left]分解问题每次将序列对半分割即可,然后使用递归得到子问题的解:# 中间一分为二mid = (left + right) // 2# 递归法:得到左边最大子序列和,不包含右边序列leftSum = divide(nums, left, mid)# 递归得到右边最大子序列和,不包含mid及其左边序列rightSum = divide(nums, mid + 1, right)合并子问题的解这是最关键的一步,上面把序列规模进行对半分割后,我们需要通过左边序列的解和右边序列的解一起来得出最终的完整序列的解。假设我们定义方法: divide(nums, left, right) 为序列 nums[left:right+1] 中最大连续子列的和;进行规模分割,有 mid=(left + right) // 2,那么原来的列表被划分为两个子列表:nums[left, mid+1] 和 nums[mid+1, right]。此时 divide(nums, left, mid) 结果表示列表 nums[left:mid+1] 中的最大子序列和,记为 leftSum,而 divide(nums, mid+1, right) 的结果表示的是 nums[mid+1:right] 中的最大子序列和,记为 rightSum。那么我们仅拿着左右着两边最大子序列和的最大值,即 max(leftSum, rightSum) 来作为原问题的解,是否可行?显然是不行的,因为如果原问题的最大连续子列并不单独在左边和右边,而可能同时包含左子列和右子列的元素:分治解法思路此时,我们需要考虑如何从左右子序列中找到包含左右子序列元素的最大连续子序列和。因为序列连续,所有会比较简单,我们直接从 mid 开始分别往左边移动,计算包含每个元素的连续和 (该元素到 mid 位置的元素全部要包括),找到最大值,得到 leftMidSum。右边的子序列做同样的操作,得到 rightMidSum。最后这两个值的和就是同时包含左右子序列元素的最大连续数列的和:leftMidSum + rightMidSum。这个时候我们在拿这三个的值进行比较,找到最大值,此时得到的结果才是原问题的解:max(max(leftSum, rightSum), leftMidSum + rightMidSum)。寻找包含左右子列元素的最大连续数列和上述实现查找包含左右连续子序列最大和的方法如下:# 从找出包含mid的左边连续序列的最大值leftVal = 0 leftMidSum = nums[mid] - 1for i in range(mid, left - 1, -1): leftVal += nums[i] leftMidSum = max(leftVal, leftMidSum) # 找出右边序列中最大值rightVal = 0 rightMidSum = nums[mid + 1] - 1for i in range(mid + 1, right + 1): rightVal += nums[i] rightMidSum = max(rightVal, rightMidSum)最后原问题的解为三个值中的最大值,即:max(max(leftSum, rightSum), leftMidSum + rightMidSum)通过上述分析,我们最终得到如下 Python 代码:def maxSubArray(nums): """ 分治法 """ def divide(nums, left, right): if left == right: return nums[left] # 中间一分为二 mid = (left + right) // 2 # 递归法:得到左边最大子序列和,不包含右边序列 leftSum = divide(nums, left, mid) # 递归得到右边最大子序列和,不包含mid及其左边序列 rightSum = divide(nums, mid + 1, right) # 从找出包含mid的左边连续序列的最大值 leftVal = 0 leftMidSum = nums[mid] - 1 for i in range(mid, left - 1, -1): leftVal += nums[i] leftMidSum = max(leftVal, leftMidSum) # 找出右边序列中最大值 rightVal = 0 rightMidSum = nums[mid + 1] - 1 for i in range(mid + 1, right + 1): rightVal += nums[i] rightMidSum = max(rightVal, rightMidSum) # 此时leftMidSum + rightMidSum便是中间包含mid的连续子序列的最大值 return max(max(leftSum, rightSum), leftMidSum + rightMidSum) return divide(nums, 0, len(nums) - 1) 这个执行的时间复杂度为 O(nlogn)O(nlogn)O(nlogn),提交代码耗时在所有 Python3 提交中垫底,但是这个解题的思路却是很重要的,锻炼我们分治求解能力。
- 3.2 求解思路详解 首先,我们将 3.1 节中的求解思路用下图表示:如图,我们可以更清楚地明白求解一个数组的最大子数组问题就是对 3.1 节中的步骤 2 中的三种情况的分别求解, 步骤 2 中的情况 a 和情况 b 可以通过递归求解得出结果,所以我们现在先看一下情况 c 的具体求解过程。情况 c 的求解很容易在线性时间内就可以得出结果,他并不是原问题的一个规模更小的实例,因为情况 c 中加入了一个限制(求出的子数组必须跨越下标为 mid 的中间节点)。如上图的右边图形所示,情况 c 的求解结果都会有两个子数组 A [i,mid] 和 A [mid+1,j] 组成,其中 low <= i <= mid <= j <=high。因此,我们只需要找出形如 A [i,mid] 和 A [mid+1,j] 的最大子数组,然后将其合并即可。我们用下面的伪代码 FindMaxCrossSubarray 描述 3.1 节中 步骤 2 中的情况 c 具体实现过程:FindMaxCrossSubarray(A, low, mid ,high): leftSum = minInteger; //设置左边的最大连续和初始值为最小整数值 sum =0; maxLeft = mid; //记录左边最大子数组的下标位置,初始化为mid for (i=mid; i>=low; i--){ sum = sum + A[i]; if (sum > leftSum){ leftSum = sum; maxtLeft = i; } } rightSum = minInteger; //设置右边的最大连续和初始值为最小整数值 sum = 0; maxtRight = mid + 1; //记录右边最大子数组的下标位置,初始化为mid+1 for (j=mid+1; j<=low; j++){ sum = sum + A[j]; if (sum > rightSum){ rightSum = sum; maxtRight = j;//记录左边最大子数组的下标位置 } } //返回结果是一个三元组数据,分别是最大子数组的开始下标,结束下标,求和的值 return (maxLeft,maxRight,leftSum+rightSum); 上述伪代码的描述中的第 2 至第 11 行,是求解左半部分 A [low,mid] 的最大子数组的过程,因为必须包含下标为 mid 的元素,所以从下标为 mid 的中间节点开始逐步递减到下标为 low 的元素,对应伪代码中的第 5 至第 11 行的 for 循环结构,循环的过程中会记录下左边部分的最大子数组的具体值及左半部分的下标位置。同理,上述伪代码的第 12 至第 21 行对应的是求解右半部分 A [mid+1,high] 的最大子数组的过程。最后,伪代码中的第 23 行综合左右两边求解结果,返回必须跨越下标为 mid 的中间元素时,对应的原数组 A 的最大子数组结果。当我们可以清楚地知道步骤 2 中的情况 c 的求解过程时,我们就可以综合知道对于数组 A 求解最大子数组的整体过程,用伪代码 FindMaxSubarray 描述如下:FindMaxSubarray(A,low,high): if (high == low){ return new Result(low,high,A[low]); //基础情况,只有一个元素时候的处理情况 }else { //对应2.1节中步骤1,找到中间元素 int mid = (low + high)/2; //对应2.1节中步骤2,分别对应a,b,c三种情况求解最大子数组结果 (leftLow,leftHigh,leftSum) = FindMaxSubarray(A,low,mid); (rightLow,rightHigh,rightSum) = FindMaxSubarray(A,mid+1,high); (crossLow,crossHigh,crossSum) = FindMaxCrossSubarray(A,low,mid,high); //对应2.1节中步骤3,比较得出最后结果 if(leftSum >= righSum && leftSum >= crossSum){ return (leftLow,leftHigh,leftSum); }else if (rightSum >= leftSum && rightSum >= crossSum){ return (rightLow,rightHigh,rightSum); }else { return (crossLow,crossHigh,crossSum); } }上述求解数组 A 的最大子数组的整体过程伪代码,主要就是由我们在 2.1 节中描述的三大步骤而来。代码第 2 至第 4 行,主要表明了最基础的情况的处理方式。代码第 4 至第 18 行对应着具体的实现方式,第 8 行和第 9 行分别是对子问题的递归求解,第 10 行调用 FindMaxCrossSubarray 过程,求解跨越中间节点的最大子数组求解方式,最后第 12 至 18 行对比三种情况的结果得出最终结果。
- 2. 最小 K 个数 来看一道常见的面试题,题目描述如下:设计一个算法,找出数组中最小的k个数。以任意顺序返回这k个数均可。示例:输入: arr = [1,3,5,7,2,4,6,8], k = 4输出: [1,2,3,4]Tips:0 <= len(arr) <= 100000;0 <= k <= min(100000, len(arr));其实不用分治法,直接考虑快排之后选择前 k 个数即能通过题解。但是本题我们要换一种思路,使用分治法来解决该题。首先定义解决原问题的方法:def divide(arr, left, right, k): """ 找出arr[left:right+1]中的最小k个数并返回 """ pass终止条件很明显,我们要找数组中最小的 k 个数,如果数组长度为空或者长度小于 k,我们可以直接返回该数组:# 注意 left 和 right 用于限定数组# 终止条件if not k: return []# 终止条件if (right - left + 1) <= k: return arr[left: right + 1]分解列表和之前一样,都是对半分,mid = (left + right) // 2,那么数组会被划分为如下两个部分:arr[left:mid + 1] # 左半部分arr[mid + 1:right] # 右半部分对于的子问题的解为:# 得到左子列的最小k个数arr_left_k = divide(arr, left, mid, k)# 得到右子列的最小k个数arr_right_k = divide(arr, mid + 1, right, k)合并子结果,得到原问题的解首先定义方法:divide(nums, left, right, k),该方法会找出列表 nums[left:right + 1] 中前最小的 k 个数。我们用分治法后,将列表分成两个子列:nums[left:mid + 1] 和 nums[mid + 1:right + 1]。这样方法 divide(nums, left, mid, k) 返回的结果是左子列中前 k 个最小值,方法 divide(nums, mid + 1, right, k) 返回的结果是右边子列中前 k 个最小值。此时我们知道,整个数组的前 k 个最小值必定在这 2k 个元素中。那么接下来的问题就是从这两 k 个值中找出最小的 k 个数即可,简单点的方式就是快排后取前 k 个。当问题规模 n 远大于 k 时,我们会发现排序所耗时间 O(klogk)O(klogk)O(klogk) 非常小,这样也决定了该分治算法的高效性。# 组成2k个数的列表arr_k = []for i in range(len(arr_left_k)): arr_k.append(arr_left_k[i]) arr_k.extend(arr_right_k)# 使用快排方法,取前k个数,即为结果,直接返回arr_k.sort()最后返回我们想要的前 k 个元素即可:return arr_k[:k]综合上述几点,我们得到了如下完整的 Python 实现:def smallestK(arr, k): def divide(arr, left, right, k): # 终止条件 if not k: return [] # 终止条件 if (right - left + 1) <= k: return arr[left: right + 1] # 分治法 mid = (left + right) // 2 # 得到左子列的最小k个数 arr_left_k = divide(arr, left, mid, k) # 得到右子列的最小k个数 arr_right_k = divide(arr, mid + 1, right, k) # 组成2k个数的列表 arr_k = [] for i in range(len(arr_left_k)): arr_k.append(arr_left_k[i]) arr_k.extend(arr_right_k) # 使用快排方法,取前k个数,即为结果,直接返回 arr_k.sort() return arr_k[:k] return divide(arr, 0, len(arr) - 1, k)最后提交测试,处于中上游水平。这道题目比较经典的做法是使用堆排序的方法,得到的最小 k 个数,大家可以课后使用堆排序的方法完成。
- 2.3 函数参数 上述我们了解了函数的定义,在其中无参函数调用即调用函数名即可,对于有参函数,需要传递一定的参数来执行对应的操作,函数的参数和脚本的参数类型及用法一致,在此我们简单回顾下,看参数在函数中都有哪些分类,及该如何使用。2.3.1 位置参数位置参数顾名思义,就是传递给函数参数的位置,例如给一个函数传递一个参数,我们可以在执行 Shell 脚本获取对应位置的参数,获取参数的格式为:$n。n 代表一个数字,在此需要注意与脚本传递参数不一样,$0 为依旧为脚本的名称,在函数参数传递中,例如传递给函数的第一个参数获取就为 $1,第 2 个参数就为 $2, 以此类推……,需要其 $0 为该函数的名称。例如:[root@master func]# cat f1.sh #!/bin/bashfunction f1() { echo "函数的第一个参数为: ${1}" echo "函数的第二个参数为: ${2}" echo "函数的第三个参数为: ${3}"}# 调用函数f1 shell linux python go[root@master func]# bash f1.sh 函数的第一个参数为: shell函数的第二个参数为: linux函数的第三个参数为: python我们可以看到传递给 f1 函数共 4 个位置参数,在结果输出中可以看到由于函数体内部只对三个参数进行了处理,后续的参数也就不再处理了。2.3.2 特殊参数在 Shell 中也存在特殊含义的参数如下表:变量含义$#传递给函数的参数个数总和$*传递给脚本或函数的所有参数,当被双引号 " " 包含时,所有的位置参数被看做一个字符串$@传递给脚本或函数的所有参数,当被双引号 " " 包含时,每个位置参数被看做独立的字符串$?$? 表示函数的退出状态,返回为 0 为执行成功,非 0 则为执行失败示例:[root@master func]# cat f1.sh #!/bin/bashfunction fsum() { echo "函数第一个参数为: ${1}" echo "函数第二个参数为: ${2}" echo "函数第三个参数为: ${3}" echo "函数的参数总数为: ${#}" echo "函数的参数总数为: ${@}" local sum=0 for num in ${@}; do let sum=${sum}+${num} done echo "计算的总和为: ${sum}" return 0}# 调用函数fsum 10 20 1 2echo $?[root@master func]# bash f1.sh 函数第一个参数为: 10函数第二个参数为: 20函数第三个参数为: 1函数的参数总数为: 4函数的参数总数为: 10 20 1 2计算的总和为: 330如上可以看到特殊参数与 Shell 脚本传递参数一样。Tips:局部变量需要特别声明在函数内部利用 local 关键字来声明。
- 1.3 具体实现代码(递归实现) fun main() { val numberArray = intArrayOf(1, 3, 5, 7, 9, 11) println(binarySearch(numberArray, 0, numberArray.size - 1, 5))}fun binarySearch(numberArray: IntArray, low: Int, high: Int, targetNum: Int): Int { if (low > high) { return -1 } val mid = (low + high) ushr 1 if (targetNum == numberArray[mid]) { return mid } return if (targetNum > numberArray[mid]) { binarySearch(numberArray, mid + 1, high, targetNum) } else { binarySearch(numberArray, low, mid - 1, targetNum) }}
mid函数相关搜索
-
mac osx
machine_start
macox
magellan
malloc
manifest
manifest文件
map
map 遍历
mapreduce编程
maps google com
margin
margin bottom
margin left
margin right
margin top
marginbottom
marginheight
marginleft
margintop