searchInsert 函数返回目标应基于值的索引。为什么它应该有这条线
return -1;
在下面的代码中?我想我在缩小 *nums 数组的范围时包含了所有可能的结果。我一评论,结果就出错了。
#include <stdio.h>
#include<stdlib.h>
int searchInsert(int* nums, int numsSize, int target) {
int s = 0;
int b = numsSize-1;
//the special case in the first place
if(target > nums[b]){
return numsSize;
};
if(target <= nums[s]){
return 0;
};
//do the main process
return narrow(nums, s, b, target);
}
int middleF(int s, int b){
return (b+s)/2;
}
int narrow(int* nums, int s, int b, int target){
//set middle
int middle = middleF(s,b);
//easy conditon
if(target == nums[middle]){
return middle;
};
if(target == nums[s]){
return s;
};
if(target == nums[b]){
return b;
};
if(b-s == 1){
return s+1;
};
//narrow
if(target < nums[middle]){
return narrow(nums, s, middle, target);
};
if(target > nums[middle]){
return narrow(nums, middle, b, target);
};
return -1;
}
int main(){
int arr[] = {1,3,5,6};
//supposed to be 2
printf("%d",searchInsert(arr,4,5));
//supposed to be 1
printf("%d",searchInsert(arr,4,2));
//supposed to be 4
printf("%d",searchInsert(arr,4,7));
}
我尝试搜索是否必须有一个默认返回值,即使在 C 中编译时实际情况不会发生。但还没有找到有用的东西。
-Werror=return-type
这会导致编译器因错误而中断编译。正如您在 Godbolt 上看到的,它不需要就可以工作
return -1;
https://godbolt.org/z/xd8srfdhc
并且根据https://en.cppreference.com/w/c/language/return,它的定义明确:
如果函数的结果用于表达式中,则到达任何其他返回值函数的末尾都是未定义的行为(允许丢弃此类返回值)。更好的解决方案是使用最后一个可能的返回值作为默认值:
#include <stdio.h>
#include<stdlib.h>
int searchInsert(int* nums, int numsSize, int target) {
int s = 0;
int b = numsSize-1;
//the special case in the first place
if(target > nums[b]){
return numsSize;
};
if(target <= nums[s]){
return 0;
};
//do the main process
return narrow(nums, s, b, target);
}
int middleF(int s, int b){
return (b+s)/2;
}
int narrow(int* nums, int s, int b, int target){
//set middle
int middle = middleF(s,b);
//easy conditon
if(target == nums[middle]){
return middle;
};
if(target == nums[s]){
return s;
};
if(target == nums[b]){
return b;
};
if(b-s == 1){
return s+1;
};
//narrow
if(target < nums[middle]){
return narrow(nums, s, middle, target);
};
return narrow(nums, middle, b, target);
}
int main(){
int arr[] = {1,3,5,6};
//supposed to be 2
printf("%d",searchInsert(arr,4,5));
//supposed to be 1
printf("%d",searchInsert(arr,4,2));
//supposed to be 4
printf("%d",searchInsert(arr,4,7));
}