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

牛客网错误记录 三 :

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

   如果不是排序数组,我们可以直接遍历,判断数字是否等于给定数字,等于则统计次数加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且其前面的数字不等于给定项  。或者没有找到给定数字,前面索引项大于后面索引项的时候,也退出。

  写递归函数首先要想清楚递归结束的条件,否则会越写越乱,另外,如果遇到很纠结的问题,比如编译通不过,不要和自己太较劲,可以参考别人的代码。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值