您的位置:首页 > 编程语言 > C语言/C++

control may reach end of non-void function [-Werror,-Wreturn-type] 错误记录

2016-07-12 16:18 851 查看
牛客网错误记录 三 :

题目: 统计一个排序数组中 某个数字出现的次数

如果不是排序数组,我们可以直接遍历,判断数字是否等于给定数字,等于则统计次数加1 。这样遍历的时间效率是o(n),因为是排序数组,可以使用二分查找法。二分查找就需要用到递归,写出如下代码后,在牛客网死活编译不过,在vs08上则可以运行,一直报下面的错误。

/solution.h:21:1: error: control may reach end of non-void function [-Werror,-Wreturn-type]

实现没有办法,查看别人的代码,才发现我只是没有在递归函数内部写 return 。。。。。。。

<span style="background-color: rgb(255, 255, 255);">class Solution {
public:
int GetNumberOfK_first(vector<int> data ,int k, int start ,int end )
{
if(start> end ) return -1 ;
int mid = (start + end) /2 ;
if( data[mid] == k){
if( ((mid - 1) >=0 && (data[mid -1] != k) )|| (mid == 0)){
return mid ;
}
else {
end = mid -1 ;
}
}
else if (data[mid] > k){
end = mid -1 ;
}else{
start = mid +1 ;
}
<span style="color:#ff0000;">return GetNumberOfK_first(data , k,start ,end );   //这里不写return ,就会报上面的错误。</span>
}
int  GetNumberOfK_last(vector<int> data ,int k,int start ,int end ){
if(start > end ) return -1 ;
int mid = (start + end) /2 ;
if( data[mid] == k){
if( (((mid + 1) <= end) && (data[mid +1] != k ) ) || (mid == end) ) return mid ;
else {
start = mid +1 ;
}
}
else if (data[mid] > k){
end = mid -1 ;
}else{
start = mid +1 ;
}
return GetNumberOfK_last(data , k,start ,end );
}
int GetNumberOfK(vector<int> data , int k)
{
int length = data.size() ;
if( length <= 0)  return 0 ;
int first = GetNumberOfK_first(data,k,0 ,length -1 );
int last = GetNumberOfK_last(data,k,0 ,length -1 );
if(first > -1 && last > -1)  return last - first + 1;
else return 0 ;
}

};</span>


最后写下二分统计思路:

两个函数,找第一次出现的位置和最后一次出现的位置。寻找第一次出现的位置函数 递归结束的条件是 当中间索引项值等于给定数字 且 索引项等于0或者 索引项大于0且其前面的数字不等于给定项 。或者没有找到给定数字,前面索引项大于后面索引项的时候,也退出。

写递归函数首先要想清楚递归结束的条件,否则会越写越乱,另外,如果遇到很纠结的问题,比如编译通不过,不要和自己太较劲,可以参考别人的代码。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++