博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
面试题3:数组中重复的数字,不能修改原数组
阅读量:5928 次
发布时间:2019-06-19

本文共 1553 字,大约阅读时间需要 5 分钟。

  •  
  • #include 
    #include
    /* 面试题3:数组中重复的数字: 问题: 在len长、值域为【1,len-1】的数组中找到重复的那个数字,不能修改原数组 解决: 哈希表,时间空间复杂度都是o(n) 二分查找,不断的查找重复的数字是在值域的前半区间内,还是在后半区间内 时间复杂度为o(nlgn), 空间复杂度为o(1)*/using namespace std;// 返回[low, up]范围内是否有重复数字bool check_repeat(const vector
    array_n, const int len, const int up,const int low){ int number = 0; for(int i = 0; i < len; i++) { if (array_n[i]>=low && array_n[i]<=up) number++; } if (up-low+1 < number) return true; else return false;}//在len长、值域为【1,len-1】的数组中找到重复的那个数字int getduplication(const vector
    array_n, const int len){ if (array_n.size() == 0) return -1; for (int i = 0; i < len; i++) if (array_n[i] > len-1 || array_n[i] < 1) return -2; int up = len-1; int low = 0; while(true) { if (up == low) break; if (check_repeat(array_n, len, up, low/2+up/2)) low = low/2+up/2; else up = low/2+up/2-1; } return up;}int main(void){ int len; cin >> len; vector
    array_n(len, 0); for (int i = 0; i < len; i++) cin >> array_n[i]; int duplication = getduplication(array_n, len); if (duplication == -1) cout << "输入的数组为空"; else if (duplication == -2) cout << "输入的数组的值域不在【" << 1 << "," << len-1 << "】之间"; else cout << duplication; return 0;}

     

转载于:https://www.cnblogs.com/jkn1234/p/8878176.html

你可能感兴趣的文章
利用Xshell实现非对称秘钥对安全登陆linux服务器(Centos、Ubuntu)
查看>>
专题1.1——Exchange2013部署前准备条件
查看>>
Shell练习题(持续更新)
查看>>
[杭电ACM]1012u Calculate e
查看>>
.NET程序加壳的基本原理和方式浅析
查看>>
EF ORM
查看>>
对C# 程序员来说现在是到目前为止最好的时代
查看>>
自学网页设计
查看>>
Apache-Jmeter监控服务资源
查看>>
sed简单用法
查看>>
xen虚拟机管理xm的用法
查看>>
我的友情链接
查看>>
Centos6.8 安装spark-2.3.1 以及 scala-2.12.2
查看>>
linux注意的一些地方
查看>>
我的友情链接
查看>>
Hibernate简单例子以及笔记
查看>>
网络工程师要如何选择?
查看>>
curl liinux下http命令执行工具
查看>>
9 C++ Boost 多线程,线程同步
查看>>
win 7 旗舰版镜像 注入USB3.0 驱动
查看>>