给出一个数列,要求找到两个下标,比如 1 2 3 6 5 4 7 8 9;如果我们排序这两个下标中间的数,那么整个数列都是排序好的了。

这个数列就是下标3和6;就是只要把 子数列6 5 4 7排序好4 5 6 7 那么整个数列都排序好了。要求这个中间未排序的子序列最小。

书中给出的思路:

1 先左边往右搜索,找到第一个递减的下标,然后右边王左搜索,找到第一个递增的下标

2 两个下标把数列分为三部分,然后找到中间子数列最小和最大值

3 然后找到左边数列第一个小于最小值的下标,找到右边第一个大于最大值的下标。

我思考了很久,终于下结论,这个思路是错误的,这么经典的书,怎么会犯那样的错误呢? 到了官网查找errata,并未提及,报告之,等等有什么反应。

这个思路如果查找数列如{2,7,9,5,5,3,8,10};那答案是1和5,明显是错误的。

我的解题思路是:

1 从左往右选择最大值冒泡排序一次,最后一次交换数据的地方就是最右下标;注意这里只是一次循环就行了,时间复杂度O(n),不是O(n*n)

2 从右往左选择最小值冒泡排序一次,最后一次交换数据的地方就是最左下标了。

左右下标确定,得到解。对于数列:int a[] = {2,7,9,5,5,3,8,10};,原来答案是1,5更正应该是1,6

原解答程序:

int findLeftEnd(vector<int> &vi)
{for (int i = 1; i < vi.size(); i++){if(vi[i] < vi[i-1]) return i-1;}return vi.size()-1;
}int findRightStart(vector<int> &vi)
{for (int i = vi.size()-2; i >= 0; i--){if(vi[i] > vi[i+1]) return i+1;}return 0;
}int shrinkLeft(vector<int> &vi, int minIndex, int start)
{int comp = vi[minIndex];for (int i = start - 1; i >= 0; i--){if(vi[i] <= comp) return i+1;}return 0;
}int shrinkRight(vector<int> &vi, int maxIndex, int start)
{int comp = vi[maxIndex];for (int i = start; i < vi.size(); i++){if (vi[i] >= comp) return i-1;}return vi.size()-1;
}void findUnsorted(vector<int> &vi)
{int leftEnd = findLeftEnd(vi);int rightstart = findRightStart(vi);int minIndex = leftEnd + 1;int maxIndex = rightstart - 1;//不用判断|| maxIndex < 0,因为两个条件中一个成立,另外一个肯定成立。if (minIndex >= vi.size()) return ;for (int i = leftEnd + 2; i < rightstart - 1; i++){if (vi[i] < vi[minIndex]) minIndex = i;if (vi[i] > vi[maxIndex]) maxIndex = i;}int lindex = shrinkLeft(vi, minIndex, leftEnd);int rindex = shrinkRight(vi, maxIndex, rightstart);cout<<"Unsorted array (satrt point, end point) is: \n";cout<<"("<<lindex<<":"<<rindex<<")"<<endl;
}

我的解答:

int maxBubble(vector<int> &vi)
{vector<int> vt = vi;int r = 0;for (int i = 1; i < vt.size(); i++){if (vt[i] < vt[i-1]){swap(vt[i], vt[i-1]);r = i;}}return r;
}int minBubble(vector<int> &vi)
{vector<int> vt = vi;int r = 0;for (int i = vt.size()-2; i >=0; i--){if (vt[i] > vt[i+1]){swap(vt[i], vt[i+1]);r = i;}}return r;
}void improFindUnsorted(vector<int> &vi)
{int left = minBubble(vi);int right = maxBubble(vi);cout<<"("<<left<<":"<<right<<")"<<endl;
}

测试程序:

int main()
{int a[] = {2,7,9,5,5,3,8,10};int len = sizeof(a)/sizeof(int);vector<int> vi(a, a+len);cout<<"The array is:\n";for (auto x:vi)cout<<x<<" ";cout<<endl;cout<<"The Original answer is:\n";findUnsorted(vi);cout<<"My answer is:\n";improFindUnsorted(vi);system("pause");return 0;
}

面试题:找出数列中间未排序好的子数列相关推荐

  1. 【408计算机考研】|【2018统考真题-41】| 给定一个含 n(n≥1)个整数的数组,请设计一个在时间上尽可能高效的算法,找出数组中未出现的最小正整数

    目录 一.题目 二.解答 三.测试数据 一.题目   给定一个含 n(n≥1)个整数的数组,请设计一个在时间上尽可能高效的算 法,找出数组中未出现的最小正整数.例如,数组{-5, 3, 2, 3}中未 ...

  2. 给定一个含n(n≥1)个整数的数组,请设计一个在时间上尽可能高效的算法,找出数组中未出现的最小正整数。

    笔者初涉<算法设计与分析>这门专业课,在做一些算法设计题的过程中遇到一些小感悟,特此记录和大家分享. 下面直接给出算法题目: 给定一个含n(n≥1)个整数的数组,请设计一个在时间上尽可能高 ...

  3. python3数据分析面试题--找出出现次数最多的名字并统计次数

    前段时间有一个朋友说遇到一个数据分析的面试题,今天来和大家分享一下. 题目是这样的:有一个姓名列表,列表中有很多名字,且有些名字是重复的,要求是找出出现次数最多的名字,以及出现的次数. 上代码: fr ...

  4. 算法试题 - 找出最小 k 个数

    题目 题目:输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 解析 思路1 这一题应用堆排序算法复杂度只有O(nlog k), ...

  5. 如何找出应用程序未使用绑定变量

    SQL开发的过程中,如果不使用绑定变量,会对数据库性能造成非常严重的影响请看如下示例代码: begin   for i in 1..1000 loop   execute immediate 'ins ...

  6. 算法试题 - 找出字符流中第一个不重复的元素

    题目 题目:请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从字符流中只读出前两个字符"go"时, 第一个只出现一次的字符是"g".当从该字符流中 ...

  7. 华为OD机试题 - 找出重复代码(JavaScript)| 包含代码编写思路

    最近更新的博客 华为OD机试题 - 字符串加密(JavaScript) 华为OD机试题 - 字母消消乐(JavaScript) 华为OD机试题 - 字母计数(JavaScript) 华为OD机试题 - ...

  8. 每天一道算法题(27)——找出元音字母并排序

    题目: 有一字符串,里面可能包含英文字母(大写.小写).数字.特殊字符,现在需要实现一函数,将此字符串中的元音字母挑选出来,存入另一个字符串中,并对字符串中的字母进行从小到大的排序(小写的元音字母在前 ...

  9. 数据结构 2018统考题【找出数组中未出现的最小正整数】

    王道论坛课本

最新文章

  1. 不显示调用super_super关键字
  2. 关于jspsmartupload中的各种问题
  3. HTML文本框中只能输入纯数字
  4. 调用bash shell脚本的方式
  5. 计算机办公自动化考题,办公自动化试题(附答案).doc
  6. 企业资源计划软件 业务知识点汇编整理
  7. 打孔屏+屏下指纹!这届iPhone全是安卓玩剩下的
  8. 【wikioi】1014 装箱问题
  9. Moonbox v0.3beta 发布:Grid 全新重构,更快更解耦
  10. PassFab iPhone Unlocker安装方法
  11. python爬虫微博24小时热搜_GitHub - Writeup007/weibo_Hot_Search: 微博爬虫:每天定时爬取微博热搜榜的内容,留下互联网人的记忆。...
  12. AutoJS实现微信自动聊天机器人
  13. 用Java实现美女选妃
  14. Windows 8如何关闭自动维护_-Chaz-_新浪博客
  15. 华盛顿道格拉斯县计划建立区块链创新园区
  16. 许晓斌_Maven实战(六)——Gradle,构建工具的未来?
  17. PHP过滤昵称中emoji表情
  18. 三个数相减的平方公式_小学二年级数学34个必考公式以及重难点解析
  19. 工程流体力学笔记暂记43 (收缩喷管中的流动)
  20. 第三代计算机期间出现了什么问题,第三代电子计算机使用的电子元件是什么_常见问题解析...

热门文章

  1. unl构件图与部署图
  2. ethtool查看网卡统计信息的流程
  3. 戴尔笔记本电源已接通未充电
  4. 8月1日任务 11.14-11.17
  5. 凯翔:可以同时替代Nimble和Nutanix的存储
  6. 感激爸妈----您们辛苦了
  7. kodi linux版本,Linux下安装多媒体中心 Kodi 18.8 新版本并设置中文界面
  8. 一文了解无聊猿(BAYC)的 NFT 帝国是如何形成的
  9. EasyExcel压缩包导出excel,动态生成多表头或多sheet
  10. 智安新闻丨智安网络与“南滨路国家级文化数字产业中心”就等保云业务展开成功签署战略合作协议