面试题整理-最小没出现的整数

常见算法笔试和面试题整理(带答案) 本文不打算介绍那些高逼格的算法,就讲讲最近在面试过程中遇到的算法题以及面试的时候给出的答案。算法可以说是解决所有问题的基石。很多东西都可以转换为算法问题,学习算法最大的作用就是更清楚地了解了很多东西。正所谓是,知其然更知其所以然。很多人都觉得程序就是数据结构+算法+适当的注释。不学算法,那就不要学编程了。虽然说可能没这么夸张,因为实际上还是有很多小项目是不需要太多算法的,都是代码一个劲的往上叠加就行了。但是就算没那么夸张,但是作为一个程序员,逻辑思维就是算法的思路还是很重要的。 由于篇幅有限,以下只展示. 阅读详情

题目:

#面试题#给定一个无序的整数数组,怎么找到第一个大于0,并且不在此数组的最小整数。比如[1,2,0] 返回 3, [3,4,-1,1] 返回 2。最好能O(1)空间和O(n)时间。

来源http://weibo.com/lirenchen。

 

解法:

直接考虑这个问题是比较困难的。不如先换个简单的问题。

 

问题1

给定一个数组,长度为n,除a[0]以外,其他元素都是a[i] == i。那么请找出第一个大于0,且不在此数组中的最小整数。

答案就是:  n + (a[0] == n);

 

问题2

给定一个数组,长度为n,某几个位置的元素满足 a[x] < 0 或者 a[x] > n,余下的元素都满足a[i] == i。那么请找出第一个大于0,且不在此数组中的最小整数。

答:

很明显:当x的值限定为0时。就变成了问题1。

除此之外,这个问题的解也容易求得。

情况1: 首先从1~n开始扫描,当发现i != a[i]时,直接返回i。此时的i必定是最小的未出现的整数。

情况2: 当扫描完1~n之后,那么就回归至问题1了。

for (i = 1; i < n; ++i) {
    if (i != a[i]) return i;
}
return (n + (n == a[0]));


问题3

当给出问题2之后,就需要考虑如何把原题目转换成为问题2了。

实际上要完成的任务就变成了,如何把一个数组中的元素元神归位。也就是让a[i] == i。如果能让这些元素元神归位,那么就转换成为问题2了。就很容易求解了。

算法如下:

       我们从后往前扫描,i = n - 1 to 0;

                  step1如果发现a[i] < 0 || a[i] > n; 则 continue;

                  step2 如果发现a[i] == a[a[i]]; 则continue;

                  step3 如果发现0 < a[i] < n

                          说明需要将a[i]元神归位。也就是放到a[a[i]]上去。

                           swap(a[i], a[a[i]]).

                           再跳转至step2。

 

Note: 需要注意一种有重复数的情况,比如a[11] = 2, a[2] = 2。这时候,就不用进行交换了。直接处理下一个元素。

可以给出代码:

    int i = n, t, temp;
    if (!a || n <= 0) return -1;

    while ((--i) >= 0) {
        while (0 < a[i] && a[i] < n && i != a[i]) {
            t = a[i];
            if (a[i] == a[t]) break;
            temp = a[i];
            a[i] = a[t];
            a[t] = temp;
        }
    }


好吧,到现在为止,原题已经变得很简单了。可以直接给出代码了。

原题解答

int find(int *a, int n) {
    int i = n, t, temp;
    if (!a || n <= 0) return -1;

    while ((--i) >= 0) {
        while (0 < a[i] && a[i] < n && i != a[i]) {
            t = a[i];
            if (a[i] == a[t]) break;
            temp = a[i];
            a[i] = a[t];
            a[t] = temp;
        }
    }

    for (i = 1; i < n; ++i)
        if (a[i] != i) return i;

    return (n + (a[0] == n));
}


算法复杂度分析

这里再加上对算法复杂度的分析。算法的复杂度在下面这段代码看起来。唔~~很难说清楚到底复杂底是多少。

我们不妨回归到问题本身。把一些条件分析清楚:

条件1、对于给定的一个数组。元神归位数目是有限的。假定为k。这个k表示的是,当处理完成之后,a[i] == i的数目。

             k的范围是固定的: 0 <= k < n。

条件2、对于每个元素而言,while (0 < a[i] && a[i] < n && i != a[i]) 这个while 循环里面,每交换一次,就会使得一个元神归位。如果交换了xi次,就会使得xi个元神归位。

             这个是很容易搞清楚的。因为每次交换的效果,都是让某个元神归了位。

             比如a[11] = 5, a[5] = 2, a[2] = 0;

             第一次交换: a[11] = 2, a[5] = 5, a[2] = 0;

             第二次交换: a[11] = 0, a[5] = 5, a[2] = 2;

条件3、对于整个数组而言,元神归位的数目K应该是满足:

             x0 + x1 + x2 + x3 + ..... + xn-1 = K

             这也就是说交换K次。

             注意啊: 不是每个i都会交换K次。而是所有的i交换次数的总和,应该是K次。

 

可以想象一种极端的情况,比如,当i=n-1的时候,置换次数最多。刚好把所有的元神都归位了。那么从i = n - 2开始,就再也不会进入到里面的while循环中去了。

再例如:如果i=n-1的时候,使得2个元神归了位。那么从 i = n-2 ~ 0,则只需要让k-2个元神归位了。因为已经归位的,是不用再去处理的。

 

想到这里,你应该明白了,下面这段代码的复杂度是O(n) + O(K)。由于0<=K < n。所以复杂度是O(n)。也就是线性时间完成了任务。

 

    while ((--i) >= 0) {
        while (0 < a[i] && a[i] < n && i != a[i]) {
            t = a[i];
            if (a[i] == a[t]) break;
            temp = a[i];
            a[i] = a[t];
            a[t] = temp;
        }
    }


 

 

 

 

华为OD机试之整数对最小和_整数对最小和od,Golang高级面试题2024 可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!输入两行数组array1、array2,每行首个数字为数组大小size(0 < size 阅读详情

相关推荐

阿里巴巴NLP算法面试题整理

大家好,这里是面经酱~ 今天来帮大家梳理网上公开面经中提到的阿里NLP算法岗相关面试题,欢迎在 面经酱(www.mjj666.cn) 搜索最新面经,有其他公司、岗位的面经梳理需求请留言哦~ 今天来帮大家梳理网上公开面经中提到的阿里NLP算法岗相关面试题,欢迎在 面经酱(www.mjj666.cn) 搜索最新面经,有其他公司、岗位的面经梳理需求请留言哦~ 编程&数学基础 【高频】Topk 三叉树遍历 求一个大于等于输入的正整数的最小降序序列 快排 提取有效的ip地址 【高频】贪心和DP的区别 给定x

neituijiang的博客 2479

求数组中未出现的最小正整数

定义一个长度为N的数组并随意赋值,找出数组中未出现的最小正整数

m0_61630865的博客 2157

python求解整数线性规划(1),京东最新Python面试真题解析

🍅 硬核资料:关注即可领取PPT模板、简历模板、行业经典书籍PDF。🍅 技术互助:技术群大佬指点迷津,你的问题可能不是问题,求资源在群里喊一声。🍅 面试题库:由技术群里的小伙伴们共同投稿,热乎的大厂面试真题,持续更新中。🍅 知识体系:含编程语言、算法、大数据生态圈组件(Mysql、Hive、Spark、Flink)、数据仓库、Python、前端等等。网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

m0_61549674的博客 815

找到数组中未出现的最小整数

【题目】: 给定一个无序整型数组arr,找到数组中未出现的最小正整数。要求时间复杂度为O(N),空间复杂度为O(1)。 例如: arr=[-1,2,3,4]。返回1。 arr=[1,2,3,4]。返回5。 【解法】 一、穷举查找 最小正整数是1,所以常规的方法就是在数组中找1,然后是2,依次找下去…。一直找到第一个没有出现的正整数,这个数就是未出现的最小的正整数。 for i = 1...

雪雪 3733

mysql性能优化面试题,字节跳动+京东+360+网易面试题整理

设计一个有getMin功能的栈(士★☆☆☆)由两个栈组成的队列(尉★★☆☆)如何仅用递归函数和栈操作逆序一个栈(尉★★☆☆)猫狗队列(士★☆☆☆)用一个栈实现另一个栈的排序(士★☆☆☆)用栈来求解汉诺塔问题(校★★★☆)生成窗口最大值数组(尉★★☆☆)构造数组的MaxTree(校★★★☆)求最大子矩阵的大小(校★★★☆)最大值减去最小值小于或等于num的子数组数量(校★★★☆)

m0_61549740的博客 1068

求字符串所有整数最小和 - 华为OD统一考试(C卷)

OD统一考试(C卷)分值: 100分题解: Java / Python / C++。 1.输入字符串s输出s中包含所有整数的最小和,说明:1字符串s只包含a\~z,A~Z,+,-, 2.合法的整数包括正整数,一个或者多个0-9组成,如:0,2,3,002,102 3.负整数,负号开头,数字部分由一个或者多个0-9组成,如-2,-012,-23,-00023 ## 输入描述 包含数字的字符串 ## 输出描述 所有整数的最小和

学习,你不是一个人在战斗 ~ 961302305(QQ,微信) 972

找出未出现的最小正整数

找出未出现的最小正整数,C语言

m0_56332819的博客 689

C语言——利用矩阵LU分解法求逆、行列式

本章介绍了LU分解法,以及如何利用LU分解法求逆、行列式,针对每个公式、原理、代码进行了详细介绍,希望可以给大家带来帮助。

王元笙 1万+

数组中未出现的最小正整数

题目:数组中未出现的最小正整数 给定一个无序整型数组arr,找到数组中未出现的最小正整数。要求时间复杂度为O(N),空间复杂度为O(1)。 例如: arr=[-1,2,3,4]。返回1。 arr=[1,2,3,4]。返回5。 分析: 最小正整数是1,所以常规的方法就是在数组中找1,然后是2,依次找下去...。一直找到第一个没有出现的正整数,这个数就是未出现的最小的正整数。但

taxue4485的专栏 3809

LightRAG实战:5分钟快速搭建一个轻量级法律问答系统(附完整代码)

本文通过实战指南,详细介绍了如何使用LightRAG技术快速搭建一个轻量级法律问答系统。该方案通过构建扁平化实体关系网络和混合检索策略,在5分钟内即可完成从环境准备到智能问答的完整流程,并附有完整代码,为中小团队和个人开发者提供了高效、低成本的AI应用解决方案。

time3的博客 277

Xilinx PCIe IP核示例工程仿真流程与关键任务解析

本文详细解析了Xilinx PCIe IP核示例工程的仿真流程与关键任务。通过搭建仿真环境、解读初始化日志,并深入剖析TSK_TX_MEMORY_WRITE_32等核心任务的TLP报文生成与交互过程,帮助开发者掌握PCIe IP核的仿真调试方法,为实际硬件设计提供可靠的验证基础。

weixin_28314575的博客 507

数组入门练习:数组中未出现的最小正整数

NC30 数组中未出现的最小正整数 给出一个长度为 nnn 的数组 arrarrarr,找出未在 arrarrarr 中出现的最小的正整数。 比如一下几组输入: arr=[1,2,3,4]arr=[1,2,3,4]arr=[1,2,3,4],答案为 5。 arr=[2,3,4,5]arr=[2,3,4,5]arr=[2,3,4,5],答案为 1。 arr=[−1,4,1,4]arr=[-1,4,1,4]arr=[−1,4,1,4],答案为 2。 方法一:暴力枚举 不难发现,对于长度为 nnn 的 arr

Time_Limit的博客 1113

kali2020.2安装出现的问题并附详细解决办法

kali2020.2的安装

weixin_48776804的博客 3048

大神整理的剑指Offer【所有面试题汇总】

    剑指Offer学习   剑指Offer这本书已经学习完了,从中也学习到了不少的东西,现在做一个总的目录,供自已和大家一起参考,学如逆水行舟,不进则退。只有不断地学习才能跟上时候,跟得上技术的潮流! 所有代码下载【https://github.com/Wang-Jun-Chao/coding-interviews】 目录 第01-10题 【剑指Offer学习】【面试题02:...

晓飛的博客 3万+

从SVF文件到高效验证:Formality中set_svf命令的隐藏技巧与实战解析

本文深入解析Formality中set_svf命令的高级应用技巧,涵盖SVF文件生成策略、多文件加载优化及验证效率提升方法。通过-append和-ordered选项的实战应用,帮助工程师解决芯片验证中的常见问题,实现验证通过率与运行效率的双重提升。

mqtt6iot的博客 819

瑞萨单片机,把CS文件转换为CC

1、打开CC的软件: 点击坐上角的"START" 点击"Create New Project"的"GO": 导入工程: 如下图设置后,点击"Create" 2、进入到CC的开发界面: 可以看到原启动库文件以asm文件的方式直接出现在工程中: 删除新生成的main.c,保留导入的r_main.c(以你自己的代码为准): 注意添加所有的头文件路径: 点击"...

weixin_37611121的博客 1228

大于K的最小正整数 的一种解法

全新整理:微软、谷歌、百度等公司经典面试100题23、Google2009华南地区笔试题给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含),指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。 比如,A=[1,0] K=21 那么输出结构应该为100。int findmorethan(int *p, int n, int k){ int i = 0; while(i  if(p[i++]>k)   return p[--i]; return -1;}int

crazy_zhao的专栏 1521

多雷达协同探测技术研究进展:认知跟踪与资源调度算法

源自:雷达学报作者:易伟 袁野 刘光宏 葛建军 孔令讲 杨建宇雷达是信息感知的千里眼,具有极高的军用和民用价值,广泛应用在防空预警、遥感测绘、反恐维稳等领域[1–5]。雷达信息获取与探测技术也一直是大国竞相抢占的前沿技术,同时是信息科学的重要组成部分。随着科学技术不断进步,先进电子对抗装备的不断问世和广泛列装,雷达的生存与发展正面临日益严峻的挑战。从生存环境上看,雷达面临通信等各类民用电磁干扰以及复杂的军用电磁干扰;从探测对象上看,集群、微弱、隐身、高空、低空等多样化目标的出现也给雷达探测与识别带来困难。

renhongxia1的博客 2783

100道中高级Java面试题整理

JavaEE面试题整理一、Java基础篇二、JVM篇三、Tomcat篇四、MyBatis篇五、Spring篇六、SpringMVC面试题整理七、Redis篇八、Mongodb篇九、MQ篇十、Shiro篇十一、搜索引擎篇十二、Nginx篇十三、SpringBoot篇十四、Dubbo篇 一、Java基础篇 1、JAVA中的几种基本数据类型是什么,各自占用多少字节? 浮点类型:float(4字节)、do...

ThisLX的博客 2万+

ARM Linux工控板+C# .NET Core:倍福ADS协议轻量化工业控制(附跨平台部署代码)

某自动化设备厂的倍福PLC控制系统曾依赖传统x86工控机:单台设备需配备1台Intel i5工控机(成本约8000元),功耗30W+,且Windows系统稳定性受工业环境干扰(如电磁辐射导致蓝屏)。更棘手的是,设备需部署在产线边缘(空间狭小),x86工控机的体积(4U机架)和散热需求(风扇噪音)难以适配;而多设备部署时,高硬件成本和高功耗导致年运维成本超20万元。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 954

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

面试题整理10 最小的k个数

《剑指offer》面试题30: 题目:输入n个整数,找出其中最小的k个数。例如输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。 分析:求数组的第k小,如果能改变数组,那么采用二分法;           如果求数组前k小,如果可以改变数组,同样可以采用二分法;           如果不能改变数组那么采用堆排序,大堆的查找最大数操作复杂度为O(1),插入和删

KUAILE123的专栏 1004

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

网易、百度等公司面试题整理

1、n是一个奇数,求证n(n^2-1)能被24整除(网易) n=2*k+1;那么n(n^2-1)=4*k(k+1)*(2k+1)=4*6*(1^2+...+k^2),显然能被24整除。 2、do...while和while...do有什么区别(华为) 前者先执行一遍循环体,

iamfranter的专栏 1万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

106@365大型互联网企业面试题整理&…

全新整理:微软、谷歌、百度等公司经典面试 100 题[第 101-170 题] 整理:July、二零一一年三月九日。 应网友承诺与要求,全新整理。转载,请注明出处。 博主说明: 此 100 题 V0.2 版,本人不再保证,还会提供答案。 因为之前整理的微软 100 题,已经基本上,把题目都出尽了。见谅。 --------------------------------------------微软十

IT小生 2057

Python基础面试题整理

ddd

临渊-测试开发 298

【C语言进阶】动态内存管理的面试题||练习

动态内存的面试题;两个简单的oj题

欢迎来到我的博客,有问题可以联系:luoshuaishuai2001@163.com 682
上一篇: 面试题整理-两个栈实现队列
下一篇: The C Programming Language 第1章
ju136
博客等级 码龄19年 95粉丝 80原创
评论 11
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值