1.调整奇偶数顺序
输入一个整数数组,实现一个函数,调整数组使奇数全部都位于偶数前面
具体代码实现如下:
//调整奇偶数顺序
//输入一个整数数组,实现一个函数,调整数组使奇数全部都位于偶数前面
void move_arr(int arr[], int sz){
int left = 0;
int right = sz - 1;
while (left < right){
//从左边找一个偶数
while ((left < right) && (arr[left] % 2 == 1)){
left++;
}
//从右边找一个奇数
while ((left < right) && (arr[right] % 2 == 0)){
right--;
}
if (left < right){
int tmp = arr[left];
arr[left] = arr[right];
arr[right] = arr[left];
}
}
}
void print_arr(int arr[],int sz){
int i = 0;
for (i = 0; i < sz - 1;i++){
printf("%d ",arr[i]);
}
printf("\n");
}
int main(){
int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int sz = sizeof(arr) / sizeof(arr[0]);
print_arr(arr, sz);
move_arr(arr, sz);
print_arr(arr, sz);
return 0;
}
2.字符串逆序
写一个函数,可以逆序一个字符串的内容。
具体代码实现如下:
//字符串逆序
//写一个函数,可以逆序一个字符串的内容。
void reverseStr(char* str){
int len = strlen(str); //求出字符串的长度
char *left = str; //左边字符指针
char *right = str + len - 1; //右边字符指针 = 数组首元素地址 + 字符串长度 - 1
while (left < right){
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
int main(){
char arr[100] = {0};
printf("请输入字符串:");
//scanf("%s",arr); scanf()函数:遇到空格就不在往后读取内容了
gets(arr); //gets()函数:读取一行,有空格也读取内容
reverseStr(arr);
printf("逆序后的字符串为:%s\n", arr);
return 0;
}
3.求一个字符串左旋n次的字符串
具体代码实现如下:
//求一个字符串左旋n次的字符串
//RotateLK2算法的时间复杂度为O(n),空间复杂度为O(1)
//逆置函数
void reverseStr(char *start, char *end){
while (start < end){
char tmp = *start;
*start = *end;
*end = tmp;
++start;
--end;
}
}
AB CDEF
BA FEDC 从旋转位置开始分开,分两段逆置
CDEFAB 在整体逆置
void RotateLK2(char *str,int k){
int len = strlen(str);
k %= len;
reverseStr(str, str + k - 1);
reverseStr(str + k ,str + len -1);
reverseStr(str,str + len - 1);
}
/**
// RotateLk1算法的时间复杂度为O(n * n)
void RotateLK1(char *str,int k){
int len = strlen(str);
k %= len;
int i = 0;
while (k--){
//左旋一次
char tmp = str[0];
for (i = 0; i < len - 1 ; i++){
str[i] = str[i + 1];
}
str[len - 1] = tmp;
}
*/
}
int main(){
char arr[] = "abcd";
//RotateLK1(arr, 2);
RotateLK2(arr, 2);
printf("%s\n",arr);
return 0;
}
4.字符串旋转操作:
给定s1 =AABCD和s2 = BCDAA,返回1
给定s1=abcd和s2=ACBD,返回0.
AABCD左旋一个字符得到ABCDA
AABCD左旋两个字符得到BCDAA
AABCD右旋一个字符得到DAABC
解题思路1:将所有旋转后的结果放到一个数组里,然后进行查找,但是这种做法既不好操作,
解题思路2:其实ABCDE无论怎么旋,旋转后的所有结果,都包含在了ABCDEABCD这个字符串里了。
所以可考虑,只需要将原字符串再来一遍接在后面,
然后找一找待查找的字符串是不是两倍原字符串的子集即可。
//字符串旋转结果
/*
解题思路1:将所有旋转后的结果放到一个数组里,然后进行查找,但是这种做法既不好操作,
解题思路2:其实ABCDE无论怎么旋,旋转后的所有结果,都包含在了ABCDEABCD这个字符串里了。
所以做法很简单,只需要将原字符串再来一遍接在后面,
然后找一找待查找的字符串是不是两倍原字符串的子集即可。
int findRound(const char * src, char * find)
{
char tmp[256] = { 0 }; //用一个辅助空间将原字符串做成两倍原字符串
strcpy(tmp, src); //先拷贝一遍
strcat(tmp, src); //再连接一遍
return strstr(tmp, find) != NULL; //看看找不找得到
}
*/
//如果是旋转字符串 返回1 , 不是 则返回0
//int Isrotatingstr(char arr[], char str[]) {
// char arr1[1024] = { 0 };
// strcpy(arr1, arr); //字符串复函数 , 把后面的字符串(arr) 赋值给 前面的字符数组(arr1)
// strcat(arr1, arr); //字符串连接函数 , 吧arr 连接在arr1的后面
// int ret = strstr(arr1, str);//判断arr 是不是 arr1 的子串 如果没有返回NULL
// if (ret == NULL) {
// return 0;
// }
// return 1;
//}
int findRotateStr(char arr[],char find[]){
char tmp[1024] = { 0 };//辅助空间存放两倍的原字符串 ;
strcpy(tmp, arr);
strcat(tmp,arr);
int ret = strstr(tmp,find);
if (ret == NULL){
return 0;
}
return 1;
}
int main(){
char arr[] = "ABCDEF";
char find[] = "BCDEFA";//待判断的字符串
int ret = findRotateStr(arr,find);
if (ret == 1){
printf("str是arr的旋转字符串!\n");
}
else if (ret == 0){
printf("str不是arr的旋转字符串!\n");
}
return 0;
}