leetcode-经典面/笔试题目
•
算法结构
1.消失的数字
面试题 17.04. 消失的数字 – 力扣(LeetCode)
https://leetcode.cn/problems/missing-number-lcci/
这个题目当然有好几种解法,这里我推荐一种比较优秀的思路,也就是单身狗思路:异或。
异或的特点是相异为一,相同为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.轮转数组
189. 轮转数组 – 力扣(LeetCode)
https://leetcode.cn/problems/rotate-array/description/这里我也提供一种比较优的思路,我们需要将这个数组逆置3次,第一次逆置前numsSize-1-k个元素,因为numsSize是元素个数,逆置的位置是下标,所以需要-1,第二次逆置后k个,第三次就是整体逆置。这种方法非常难想到,但是效率很高。

void Func(int* nums,int left,int right)
{
while(left=numsSize)
{
k=k%numsSize;
}
//第一次逆置前numsSize-k个
Func(nums,0,numsSize-k-1);
//第二次逆置后k个
Func(nums,numsSize-k,numsSize-1);
//第三次将整个数组逆置
Func(nums,0,numsSize-1);
}
本文来自网络,不代表协通编程立场,如若转载,请注明出处:https://net2asp.com/f6243c0de2.html
