目录
1、消失的数字
oj:面试题 17.04. 消失的数字 - 力扣(LeetCode)

思路(参考评论区):
利用异或的特性,ret = ret ^ x ^ x。级对同一个值异或两次,结果等于它本身
所以对 ret 从 0 - nums.length 进行异或,同时对 nums 数组中的值进行异或,出现重复的会消失,所以最后 ret 的值是只出现一次的数字,也就是nums数组中缺失的那个数字。
java
class Solution {
public int missingNumber(int[] nums) {
int ret = 0;
for(int i = 0; i < nums.length; i++) {
ret ^= i;
ret ^= nums[i];
}
ret ^= nums.length;
return ret;
}
}
2、旋转数组

思路:
使用额外的数组将每个元素放至旋转后的位置
遍历原数组,将原数组下标为 i 的元素放至新数组下标为 (i+k)%n 的位置
再把新数组写回原数组
java
class Solution {
public void rotate(int[] nums, int k) {
int len = nums.length;
int[] newArr = new int[len];
for(int i = 0; i < len; i++){
newArr[(i+k)%len] = nums[i];
}
for(int j = 0; j < len; j++){
nums[j] = newArr[j];
}
}
}
3、原地移除元素

思路:
- 遍历数组 nums,设置一个下标 ans
- 在遍历过程中如果出现数字不是需要被移除的值,则把这个数字覆盖到ans所在的下标位置,ans 自增 1
- 如果相同的时候,则跳过该数字不进行覆盖,最后 ans 即为新的数组长度
java
// 时间复杂度:O(n),空间复杂度:O(1)
class Solution {
public int removeElement(int[] nums, int val) {
int ans = 0;
for(int i = 0; i<nums.length; i++) {
if(nums[i] != val) {
nums[ans] = nums[i];
ans++;
}
}
return ans;
}
}
4、删除排序数组中的重复项
oj:26. 删除有序数组中的重复项 - 力扣(LeetCode)

思路:
与上题类似,使用两个指针,fast用于遍历数组,slow位置用于存放不重复项
在遍历过程中如果出现数字不是重复值,则把这个数字覆盖到slow所在的下标位置
slow+1 即为数组中唯一元素的数量
java
class Solution {
public int removeDuplicates(int[] nums) {
int fast = 1;
int slow = 0;
for(; fast<nums.length; fast++) {
if(nums[fast] != nums[slow]) {
nums[slow+1] = nums[fast];
slow++;
}
}
return slow+1;
}
}