程序程序目的是求子串在主串的位置,但是运行没有结果
断点调试len2的值就不对
1条回答 默认 最新
关注 【相关推荐】
- 这篇博客: 如何在数组(可以定义条件为有序)中找到出现次数最多的数字中的 问题:当要求找出无序数组中任一重复出现的数字,不改变数组元素,同时如果数组长度为len,那么数组元素在1-len-1之间。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
由于不改变数组元素,可以使用上述方法二,即使用map,但是空间可能会比较大。
但这里只要找出任意重复出现的元素即可,可以使用二分法。
即数值区间为1-len-1。可以把它分为2个区间,1-m和m+1-len-1如果1-区间数值个数大于m个,说明这个区间有重复的元素,否则重复元素必然出现在另一个区间中。如此二分,直到区间只有1个元素,且计数大于1时,该区间元素就是它。
但是该方法不能保证找到所有重复元素,而且不可以保证找到的是出现次数最多的元素。只可以保证不修改原数组而且不适用额外的空间,但是时间复杂度为O(nlogn)。
#include <cstdio> #include <iostream> #include <vector> #include <string> #include <sstream> using namespace std; int count_num(vector<int> &vec,int left,int right) { int cnt=0; for(int i=0;i<vec.size();i++) { if(vec[i]>=left&&vec[i]<=right) cnt++; } return cnt; } int getduplication(vector<int> &vec) { int len=vec.size(); int left=1; int right=len-1; while(left<=right) { int mid=(right-left)/2+left; int cnt=count_num(vec,left,mid); if(left==right) { if(cnt>1) { return left; } else break; } if(cnt>(mid-left+1)) { right=mid; } else left=mid+1; } return -1; } int main() { string input; getline(cin,input); istringstream istr(input); int num; vector<int> vec; while(istr>>num) { vec.push_back(num); } int res=getduplication(vec); if(res!=-1) cout<<"重复出现数字是:"<<res<<endl; else cout<<"不存在重复出现的数字:"<<endl; return 0; }
如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^解决 无用评论 打赏 举报- 这篇博客: 如何在数组(可以定义条件为有序)中找到出现次数最多的数字中的 问题:当要求找出无序数组中任一重复出现的数字,不改变数组元素,同时如果数组长度为len,那么数组元素在1-len-1之间。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
悬赏问题
- ¥15 有关类的报错,在模块里调用另一个模块的方法下的变量时出错
- ¥15 delphi7 HMAC_SHA256方式加密
- ¥15 关于#qt#的问题:我想实现qcustomplot完成坐标轴
- ¥15 下列c语言代码为何输出了多余的空格
- ¥15 kali linux用wget archive.kali.org/archive-key.asc指令下载签名无效(失败)
- ¥15 openHarmony 利用c++程序在dayu210开发板上实现拉取RTSP视频流并且在屏幕上显示
- ¥15 GD32H757的can通信配置
- ¥20 nist随机数测试的问题
- ¥20 帮我解决这个项目,thank you各位程序员
- ¥15 哪位能用ea软件做一下,有偿