Arnold_king_ 2023-12-26 20:08 采纳率: 0%
浏览 3

简单的一道大学生题,有人看看哪里错了嘛

程序程序目的是求子串在主串的位置,但是运行没有结果
断点调试len2的值就不对

img

  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-12-26 22:46
    关注

    【相关推荐】



    • 这篇博客: 如何在数组(可以定义条件为有序)中找到出现次数最多的数字中的 问题:当要求找出无序数组中任一重复出现的数字,不改变数组元素,同时如果数组长度为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;
      }
      

       


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 12月26日

悬赏问题

  • ¥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软件做一下,有偿