leetcode-经典面/笔试题目

1.消失的数字

面试题 17.04. 消失的数字 – 力扣(LeetCode)icon-default.png?t=N7T8https://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)icon-default.png?t=N7T8https://leetcode.cn/problems/rotate-array/description/这里我也提供一种比较优的思路,我们需要将这个数组逆置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);
}

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
扎眼的阳光的头像扎眼的阳光普通用户
上一篇 2023年12月14日
下一篇 2023年12月14日

相关推荐