终于熬过了漫长的期中备考,开始正式备赛!加油哦!就算最后没能成功参赛,但备赛过程终是我人生中最宝贵的回忆,加油!
昨日笔记(字迹可能有点丑,多多包涵)
题解:
昨日复习
就是在数组中寻找到那个多余的数字,并返回
利用每个数字异或清零,变成多出的那个数
力扣小练习:
剑指 Offer 03. 数组中重复的数字 - 力扣(Leetcode)
class Solution {
public int findRepeatNumber(int[] nums) {
//这道题与昨天的题不同,昨天是在已知数组中的数据后,
//找到重复的数字,而这个是不知道有什么数字,
//所以打算采取暴力题解法
Arrays.sort(nums);
int res=0;
for(int i=0;i<nums.length-1;i++){
if(nums[i]==nums[i+1]){
return nums[i] ;
}
}
return -1;
}
}
class Solution {
public int findRepeatNumber(int[] nums) {
//第二种解法:映射
int i=0;
while(i<nums.length){
//其实也是用到了排序的思想,利用了题干中所有数字都在0~n-1范围内
if(nums[i]==i){
i++;
continue;
}
if(nums[nums[i]]==nums[i]){
return nums[i];
}
//交换临时数
int temp= nums[i];
nums[i]=nums[temp];
nums[temp]=temp;
}
return-1;
}
}
开始今天的算法学习
思想:连续进行异或
同类型题:剑指 Offer II 004. 只出现一次的数字 - 力扣(Leetcode)
class Solution {
public int singleNumber(int[] nums) {
/*具体地,考虑答案的第 i 个二进制位(i 从 0 开始编号),
它可能为 0 或 1。对于数组中非答案的元素,每一个元素都出现了 3 次,
对应着第 i个二进制位的 3 个 0 或 3 个 1,
无论是哪一种情况,它们的和都是 3 的倍数(即和为 0 或 3)。*/
int ans = 0;
for (int i = 0; i < 32; ++i) {
int total = 0;
for (int num: nums) {
//遍历nums中的数组
total += ((num >> i) & 1);
//num>>1,右移运算符,相当于除i
}
if (total % 3 != 0) {
ans |= (1 << i);
}
}
return ans;
}
}