【每日刷题】Day20
🥕个人主页:开敲🍉
🔥所属专栏:每日刷题🍍
🌼文章目录🌼
1. 面试题 17.04. 消失的数字 - 力扣(LeetCode)
2. 189. 轮转数组 - 力扣(LeetCode)
3. 面试题 01.09. 字符串轮转 - 力扣(LeetCode)
1. 面试题 17.04. 消失的数字 - 力扣(LeetCode)
//思路:异或。将数组中的数全部异或起来,再与0~numsSize之间所有的数全部异或起来,就能找到缺失的数(相同的数异或在一起为0,0异或上任何数都为任何数)
int missingNumber(int* nums, int numsSize)
{
int ret = 0;
int i = 0;
for(i = 0;i<numsSize;i++)//将数组中的数异或起来,缺少的数字没有异或上
{
ret ^=nums[i];
}
for(i = 0;i<=numsSize;i++)//再与0~numsSize之间的数都异或上,这一缺少的数只异或了一次,其它数都异或了两次变为0,0再与缺少的数异或上就得到了缺少的那个数
{
ret^=i;
}
return ret;
}
2. 189. 轮转数组 - 力扣(LeetCode)
//思路:这里有个方法是将数组后K个数逆置,再将前numsSize - K个数逆置,最后再将整个数组逆置就可以得到答案(感兴趣的可以去看看这题的题解,里面有),但是由于比较难想,这里使用更加"亲民"的方法——使用新数组存储逆置后的数组,再赋给原数组
void rotate(int* nums, int numsSize, int k)
{
k%=numsSize;
int arr[100001] = {0};
int i = 0;
int j = 0;
for(i = numsSize-k;i<=numsSize-1;i++)//将后K个数放入新数组的前K个位置(注意不是倒着放,而是定位到numsSize-K的位置后,从前往后一个个放)
{
arr[j++] = nums[i];
}
for(i = 0;i<=numsSize-1-k;i++)//再将前numsSize-k-1个数放进数组后numsSize-k-1个位置
{
arr[j++] = nums[i];
}
for(i = 0;i<j;i++)//最后再把新数组的元素赋给原数组即可
{
nums[i] = arr[i];
}
}
3. 面试题 01.09. 字符串轮转 - 力扣(LeetCode)
//0ms 100%思路:将s1字符串与s1字符串拼接在一起,变成s1+s1。如果s2是由s1翻转得来,则一定能够在这个新的字符串中找到s2,否则,说明s2不是由s1翻转而来。
bool isFlipedString(char* s1, char* s2)
{
int str1 = strlen(s1);
int str2 = strlen(s2);
if(str1!=str2)//如果两个字符串长度不同,则s2不可能由s1翻转得来
{
return false;
}
char* news1 = (char*)malloc(sizeof(char)*(str1+str2+1));
sprintf(news1,"%s%s",s1,s1);//将两个s1拼接后存储再news1中,不了解sprintf可能看看下面的截图
return strstr(news1,s2)!=NULL;
}