今天又完成了一道力扣的简单题目。现在记录下来思考过程并总结一下练习过程中出现的问题。最后参考一下给力网友的最优题解,思考怎样才能像网友们那么优秀。
/************************************************************/
该命题是:给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。你可以假设数组中无重复元素。
/***********************************************************/
该题目给出几个示例,解决了这几个示例基本这道题就完成了。第一个是:输入[1,3,5,6], 5 输出2。可以看出直接循环当target == nums[i]的时候输出i就可以了;
第二个示例是:输入[1,3,5,6], 2 输出2;可以看出如果nums[i]小于target,nums[i+1]大于target,这时target插入的位置就是i+1了;
第三个示例是:输入[1,3,5,6], 7 输出4;即target比数组最大的数还要大,那就输出最后一个元素的位置+1就行;
第四个示例是:输入[1,3,5,6], 0 输出0;即target比数组最小的数还要小,那就输出插在第一个数前面,就是0号位置。
int searchInsert(int* nums, int numsSize, int target) { int i = 0; if(target < nums[0]) return 0; //如果比第一个数还小,就返回0 else if(target>nums[numsSize-1]) return numsSize; //如果比最后一个数还大,就返回最后一个数的位置+1,即numsSize else /*除了上述两种情况,就是target在数组的某个位置*/ {for(i; i<numsSize; i++) { if(nums[i] == target) {return i; break;} else if(nums[i]<target && nums[i+1]>target) {return (i+1); break;} else continue; } } return 0; }
在写的过程中遇到的一个问题是最后循环外的return 0;第一次写的时候并没有加上,然后报错:control reaches end of non-void function [-Werror=return type],百度说是非void函数没有返回值导致的。但几个if语句都包含了return语句,函数不应该是return到调用的函数中就跳出了吗?怎么最后还会检查有没有return的?
网友写了一个超级简洁的Java代码,原理也是暴力比较,但看起来简洁很多也很易懂,代码如下:
public int searchInsert(int[] nums, int target) { for(int i = 0; i < nums.length;i++){ if(nums[i] >= target){ return i; } } return nums.length; }
无可否认比我的好多了。
官方给出的解法是二分查找,但是我居然看不懂,先填个坑,洗澡去了
原文:https://www.cnblogs.com/teamcolt/p/12902616.html