1、《旋转数组》
1.1力扣题目连接:
https://leetcode-cn.com/problems/rotate-array/https://leetcode-cn.com/problems/rotate-array/
1.2 题目描述
给定一个整数数组
nums
,将数组中的元素向右轮转k
个位置,其中k
是非负数。示例 1:
输入: nums = [1,2,3,4,5,6,7], k = 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转 3 步: [5,6,7,1,2,3,4]提示:
1 <= nums.length <= 105
-231 <= nums[i] <= 231 - 1
0 <= k <= 105
1.3 解题方法
1.3.1三步旋转法( 时间复杂度O(N) )
第一步:逆序一次k个元素。
第二部:逆序一次(nums-k)个元素。
第三步:数组整体逆序。
//nums为数组指针;numSSize为数组个数;k为要旋转元素个数。
void rotate(int* nums , int numsSize, int k)
{
//对k进行取模将k控制在总元素个数内(旋转元素个数的次数时,会将数组还原)
//且取模对小于模的数没有影响
k%=numsSize;
//如果取完模后数组如果为0则不需要旋转
if(k==0);
else
{
//三步旋转法
you(nums,nums+numsSize-1-k);
you(nums+numsSize-k,nums+numsSize-1);
you(nums,nums+numsSize-1);
}
for(int i = 0 ; i<numsSize ; i++)
printf( "%d" , *(nums+i) );
}
//逆序函数
void you(int * start , int* end)
{
while(start<end)
{
int a = 0;
a =* end;
*end = *start;
*start = a;
start++;
end--;
}
}
优点:只需写一个逆序函数即可复用函数 。
2、《消失的数字》
1.1 力扣题目连接:
1.2 题目描述
数组
nums
包含从0
到n
的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?注意:本题相对书上原题稍作改动
示例 1:
输入:[3,0,1] 输出:2
1.3 解题方法
方法一 计算总和
先计算出0-n的总和,然后减去数组里的每一项
int missingNumber(int* nums, int numsSize)
{
int i=0;
//先计算出0-n的总和int sum= *nums +nums[numsSize-1] * numsSize /2;
//再用计算出的和减去数组的每一项
for(i=0 ; i<numsSize ; i++)
{
sum-=nums[i];
}
return sum;
}
方法二 位运算
利用 a^a=0 a^0=a
类似于单身狗思想
int missingNumber(int* nums, int numsSize)
{
int i=0;
int sum=0;
for(i=1;i<=numsSize;i++)
{
sum^=i;
}
for(i=0;i<numsSize;i++)
{
sum^=nums[i];
}
return sum;
}