【每日一道LeetCode】——面试题 17.04. 消失的数字、189. 轮转数组

简介: 【每日一道LeetCode】——面试题 17.04. 消失的数字、189. 轮转数组

原题:

面试题 17.04. 消失的数字

数组nums包含从0n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?

注意:本题相对书上原题稍作改动

解题思路一:(排序找不同)

数组nums包含从0n的所有整数,缺失的就在其中,所以我们可以进行排序,使数组的下标与数字对应,所以我们需要找到的是下标和数字不对应的那个,它就是我们要找的缺失的数字。

代码实现:

1. class Solution {
2. public int missingNumber(int[] nums) {
3. 
4.     Arrays.sort(nums);
5. 
6. int i=0;
7. for(i=0;i<nums.length;i++){
8. 
9. if(i!=nums[i]){
10. break;
11.         }
12.     }
13. 
14. return i;
15.     }
16. }

解题思路二:(数字加减法)

用没有缺失的数组中所有数字之和减去缺失了数字的数组所有的数字之和,它们的差就是该缺失的数字。

代码实现:

1. class Solution {
2. public int missingNumber(int[] nums) {
3. int sum=0;//记录没有缺失的和
4. int ret=0;//记录缺失的和
5. for(int i=0;i<nums.length+1;i++){
6.             ret+=i;
7.         }
8. 
9. for(int i=0;i<nums.length;i++){
10.             sum+=nums[i];
11.         }
12. 
13. return ret-sum;
14. 
15.     }
16. }

解题思路三:(异或法)

a ^ a = 0; 一个数异或自己,结果为零。a ^ 0 = a; 一个数异或零,结果为它本身

异或运算满足交换律,结合律 :

a ^ b = b ^ a ; (a ^ b) ^ c = a ^ ( b ^ c ) ;

所以,若 s = a^b^c^d; 如果其中两个数相等,比如 b==c, 则“抵消”,s = a^d。

所以当我们把所有数组下标都异或,并且再异或所有数组中的数字就可以找到缺失的数字,别忘了补上没有缺失的数组的n。

代码实现:

1. class Solution {
2. public int missingNumber(int[] nums) {
3. int ret=0;//用来进行异或运算
4. 
5. //对所有下标和数组中的数字进行异或
6. for(int i=0;i<nums.length;i++){
7.             ret^=i;
8.             ret^=nums[i];
9.         }
10. //最后别忘了n下标(补上缺失的数字后的数组下标比缺失的多1)
11.         ret^=nums.length;//n就是nums.length
12. 
13. return ret;
14. 
15.     }
16. }

原题:

189. 轮转数组

给你一个数组,将数组中的元素向右轮转 k 个位置,其中 k 是非负数。

解题思路: (翻转法)

过程:

代码实现:

1. class Solution {
2. public void rotate(int[] nums, int k) {
3.         k%=nums.length;//防止k超出数组范围
4.          reverse(nums,0,nums.length-1);//整体翻转
5.         reverse(nums,0,k-1);//前部分翻转
6.         reverse(nums,k,nums.length-1);//后部分翻转
7. 
8. 
9. 
10.     }
11. //自定义翻转方法
12. public void reverse(int[] nums,int left,int right){
13. 
14. while(left<right){
15. int temp=nums[left];
16.         nums[left]=nums[right];
17.         nums[right]=temp;
18.         left++;
19.         right--;
20.         }
21. 
22.     }
23. }

空间复杂度为 O(1)


相关文章
|
2月前
【LeetCode-每日一题】 删除排序数组中的重复项
【LeetCode-每日一题】 删除排序数组中的重复项
23 4
|
2月前
|
索引
Leetcode第三十三题(搜索旋转排序数组)
这篇文章介绍了解决LeetCode第33题“搜索旋转排序数组”的方法,该问题要求在旋转过的升序数组中找到给定目标值的索引,如果存在则返回索引,否则返回-1,文章提供了一个时间复杂度为O(logn)的二分搜索算法实现。
24 0
Leetcode第三十三题(搜索旋转排序数组)
|
2月前
|
算法 C++
Leetcode第53题(最大子数组和)
这篇文章介绍了LeetCode第53题“最大子数组和”的动态规划解法,提供了详细的状态转移方程和C++代码实现,并讨论了其他算法如贪心、分治、改进动态规划和分块累计法。
70 0
|
2月前
|
C++
【LeetCode 12】349.两个数组的交集
【LeetCode 12】349.两个数组的交集
19 0
|
4月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
1月前
|
存储 缓存 算法
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
|
1月前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
1月前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
58 4
|
2月前
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
92 2
|
2月前
|
JSON 安全 前端开发
第二次面试总结 - 宏汉科技 - Java后端开发
本文是作者对宏汉科技Java后端开发岗位的第二次面试总结,面试结果不理想,主要原因是Java基础知识掌握不牢固,文章详细列出了面试中被问到的技术问题及答案,包括字符串相关函数、抽象类与接口的区别、Java创建线程池的方式、回调函数、函数式接口、反射以及Java中的集合等。
37 0
下一篇
DataWorks