今天分享三个关于数组元素旋转和交换的问题:
问题一:
输入一个整数数组,实现一个函数,来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,所有偶数位于数组的后半部。
#define _CRT_SECURE_NO_WARNINGS
#define N 10
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void print(int a[],int size)
{
int start = 0;
int end = size-1;
while (start < end)
{
while (((a[start]) % 2 != 0)) //从前往后找第一个偶数的位置
{
start++;
}
while (((a[end]) % 2 == 0)) //从后往前找第一个奇数的位置
{
end--;
}
if (start < end) //只要start索引小于end索引
{
a[start] = a[start]^a[end]; //用异或运算符,不创建临时变量完成两个数的交换
a[end] = a[start]^a[end];
a[start] = a[start]^a[end];
}
}
}
int main()
{
int a[N];
for (int i = 0; i < N; i++)
{
scanf("%d",&a[i]);
}
print(a,N);
for (int i = 0; i < N; i++)
{
printf("%d ", a[i]);
}
printf("\n");
system("pause");
return 0;
}
讲解:思路就是从前往后每找到一个偶数和从后往前每找到一个奇数就进行交换。直到start>end就结束。
问题二:
实现一个函数,可以左旋字符串中的k个字符。
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void letf_rotate(char* str,int k)
{
k %= strlen(str); //k取余字符串长度可以少执行几次while循环,因为旋转字符串长度次会
while (k--)
{
char* cur = str; //先用一个指针记录字符串首地址
char tmp = *str; //创建一个变量存放字符串首元素
while (*(cur + 1)) //判断当前位置的下一个位置是不是'\0'
{
*cur = *(cur + 1); //不是的话则首元素的后面元素依次向前移动
cur++;
}
*cur = tmp; //最后再把tmp存的首元素赋值给'\0'前的那个位置
}
}
int main()
{
int k;
char str[1024];
scanf("%s",str);
scanf("%d",&k);
letf_rotate(str, k);
printf("%s\n",str);
system("pause");
return 0;
}
讲解:主要就是要注意第二个while循环里的条件,其他都不是很麻烦。
问题三:
判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:给定s1 =AABCD和s2 = BCDAA,返回1,给定s1=abcd和s2=ACBD,返回0.
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int is_rotate(char* dest,char* src)
{
strncat(dest,dest,strlen(dest)); //字符串拼接函数
if(strstr(dest, src)!=NULL) //字符串判断子串关系函数
return 1;
else
return 0;
}
int main()
{
char src[1024];
char dest[1024];
scanf("%s",src);
scanf("%s",dest);
printf("%d\n",is_rotate(dest,src));
system("pause");
return 0;
}
讲解:这个问题其实上面这个方法比较简单,也挺巧妙。是把目标串扩大一倍,利用字符串拼接函数strncat完成,不用strcat是因为在拼接时,首元素会覆盖原目标串’\0’的位置,然后将会一直执行下去就会导致访问越界,而strncat函数在完成规定长度位拼接后会自动在末尾加一个’\0’,然后利用strstr函数判断源串是不是扩大后的目标串的子串,这个很容易想明白字符串最多旋转它的长度位,如果再多就和%它的长度是一样的,所以把目标串扩大一倍就是相当于完成了一个字符串的长度位旋转。