面试题 17.04. 消失的数字和189. 轮转数组解题思路
前言:这是我的第一篇博客,历时时长超过两时半,我希望用博客来记录自己编程的学习生活,种一颗树最好的时间的是 十年前,其次就是现在

一、第一题的两种解题思路
1.等差数列求和
这里我们要引入一个高中的概念----数列,
数列是按照特定的规律或者次序排列的有限的数的集合,可以用来描述某种具有一定规律性的存在,在这个题中数列 一般式子为 an=an-1+1;
Sn=a1+a2……+an
Sn=an+an-1+……+a1
将求和公式倒着写一遍累和,a1+an=a2+an-1以此类推。因此:
**2Sn=(a1+an)n ->Sn=(a1+an)n/2
int missingNumber(int* nums, int numsSize){
int sum=(numsSize+1)*numsSize/2;
for(int i=0;i<numsSize;i++)
sum-=nums[i];
return sum;
}
求出数列的前n项和在减去数列中的每一项,返回值值就变成了缺的那一项
2.按位异或^法
^符号表示两个数以二进制的形式进行运算,相同为0,相反为1,因此任何数异或0都等于它本身,任何数异或它自己都等于0
int missingNumber(int* nums, int numsSize){
int sum=0;
for(int i=0;i<numsSize;i++)
{
sum^=i^nums[i];
}
return sum^numsSize;
}
产生0~N的数分别与数组中的每个元素^一下,把相同的元素消掉,在这里注意: a ^ a ^ b == a ^ b ^a ,即异或的运算满足结合律,运算结果得到的最后一个数便是缺少的那一个数
二、第二题的两种解题思路
1.三步翻转法O(N)
将一个数组右移动k位,可以等价于先把数组整体翻转,再把数组前k个翻转,在把数组的后numsSize-k个翻转。
void reverse(int*left,int*right)
{
while(left<=right)
{
int tmp;
tmp=*left;
*left=*right;
*right=tmp;
left++;
right--;
}
}
void rotate(int* nums, int numsSize, int k){
k%=numsSize;
reverse(nums,nums+numsSize-1);
reverse(nums,nums+k-1);
reverse(nums+k,nums+numsSize-1);
}
优点:在时间复杂度为O(N)内完成,且没有开辟多余的空间
2.挪位法O( N 2 N^{2} N2)和新建立数组法O(N)
1.挪位法
挪位法就是每次把数组最后一位拿出来,然后前面的元素一次往后移动
下面是挪动过程
清晰的发现就是挪动之前用k%=numsSize,利用它具有的周期性,但它还是要执行约 O ( N 2 (N^{2} (N2) 次,效率低
2.新建数组法
可在O(N)时间内完成,但是要浪费O(N)的空间
等到前面一个数组下标i+K=numsSize-1的时候就把后k个元素从新的数组的头部依次添加
结束语
以上就是我对这两个题的理解啦,初写博客的我没有什么经验,期待各位大佬的指点!