1.消失的数字
这个题目当然有好几种解法,这里我推荐一种比较优秀的思路,也就是单身狗思路:异或。
异或的特点是相异为一,相同为0,也就是两个相同的数字异或就等于0.
那么我们只需要使用两个循环就能解决问题。
第一个循环遍历nums这个数组的所有元素,由于少了一个元素5,所以判断条件是i<numsSize,假设数组中的元素如下所示,那么第二个循环只需要将这个消失的数字补上,判断条件就是i<=numsSize,然后tail和i进行异或。
那么我们就可以理解为tail在同时遍历两个数组,这里大家需要知道的一个小知识是3^4^3^4的最终结果还是0,因为这里可以使用交换律,就是3^3^4^4,就相当与两个0最后异或,还是0。除了消失的数字出现一次,其他的数字都是成对出现,所以tail结果两次遍历异或后就是消失的那个数字。
int missingNumber(int* nums, int numsSize) { int tail=0,i; for(i=0;i<numsSize;i++) { tail^=nums[i]; } for(i=0;i<=numsSize;i++) { tail^=i; } return tail; }
2.轮转数组
这里我也提供一种比较优的思路,我们需要将这个数组逆置3次,第一次逆置前numsSize-1-k个元素,因为numsSize是元素个数,逆置的位置是下标,所以需要-1,第二次逆置后k个,第三次就是整体逆置。这种方法非常难想到,但是效率很高。
void Func(int* nums,int left,int right) { while(left<=right) { int tmp=nums[left]; nums[left]=nums[right]; nums[right]=tmp; left++; right--; } } void rotate(int* nums, int numsSize, int k) { if(k>=numsSize) { k=k%numsSize; } //第一次逆置前numsSize-k个 Func(nums,0,numsSize-k-1); //第二次逆置后k个 Func(nums,numsSize-k,numsSize-1); //第三次将整个数组逆置 Func(nums,0,numsSize-1); }