【每日一道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)


相关文章
|
10天前
【LeetCode-每日一题】 删除排序数组中的重复项
【LeetCode-每日一题】 删除排序数组中的重复项
16 4
|
10天前
|
索引
Leetcode第三十三题(搜索旋转排序数组)
这篇文章介绍了解决LeetCode第33题“搜索旋转排序数组”的方法,该问题要求在旋转过的升序数组中找到给定目标值的索引,如果存在则返回索引,否则返回-1,文章提供了一个时间复杂度为O(logn)的二分搜索算法实现。
11 0
Leetcode第三十三题(搜索旋转排序数组)
|
10天前
|
算法 C++
Leetcode第53题(最大子数组和)
这篇文章介绍了LeetCode第53题“最大子数组和”的动态规划解法,提供了详细的状态转移方程和C++代码实现,并讨论了其他算法如贪心、分治、改进动态规划和分块累计法。
33 0
|
10天前
|
C++
【LeetCode 12】349.两个数组的交集
【LeetCode 12】349.两个数组的交集
12 0
|
25天前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
2月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
50 6
|
2月前
|
Python
【Leetcode刷题Python】剑指 Offer 26. 树的子结构
这篇文章提供了解决LeetCode上"剑指Offer 26. 树的子结构"问题的Python代码实现和解析,判断一棵树B是否是另一棵树A的子结构。
42 4
|
2月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
96 2
|
25天前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
2月前
|
索引 Python
【Leetcode刷题Python】从列表list中创建一颗二叉树
本文介绍了如何使用Python递归函数从列表中创建二叉树,其中每个节点的左右子节点索引分别是当前节点索引的2倍加1和2倍加2。
45 7