练习:编写一个reverse_string(char*string)递归实现
实现:将参数字符串中的字符反向排列,不是逆序打印。
要求:不能使用C函数库中的字符串操作函数
//思路:将字符串的首元素与末尾元素交换,第二位元素与倒数第二位元素交换,依次类推
//需要先求出字符串长度,再用类似二分法的方法求
int my_strlen(char* arr) //定义一个函数求出字符串长度
{
int count = 0;
while (*arr != '\0')
{
count++;
arr++;
}
return count;
}
void reverse_string(char* arr)
{
int left = 0; //左下标
int right = my_strlen(arr)-1;
char temp = arr[left];
while (left <= right)
{
temp = arr[left]; //把左边的取出来放入一个变量中
arr[left] = arr[right]; //把右边的给左边
arr[right] = temp; //把左边的给右边
left++;
right--;
}
printf("%s\n", arr);
}
int main()
{
char arr[] = "abcdef";
reverse_string(arr);
return 0;
}
用递归的方式实现:
思路:将首位和末尾字符交换作为一个函数,然后依次循环至内层
第一步:将a取出;第二步:将f放入首位,此时相当于将bcde交给函数,这个后面此时没有\0,因此需要补一个\0,然后将bcde逆序,再将a拿上去放到最后
int my_strlen(char* str) //定义一个函数求出字符串长度
{
int count = 0;
while (*str != '\0')
{
count++;
str++;
}
return count;
}
void reverse_string(char* str)
{
char tmp = *str;//1.创建一个临时变量用于放置第一个字符
int len = my_strlen(str); //求出字符串长度
*str = *(str + len - 1); //2.将最后一个字符的地址放入最前面(字符串的地址是最前面一个元素的地址)
*(str + len - 1) = '\0'; //3.将\0放入最后,此时字符串的长度减少了1位,因为\0前移了一位
if (my_strlen(str + 1) >= 2) //当逆序后中间字符串的长度是0或者1的时候就没有必要逆序了,中间字符串是0或者1就说明此时字符串的长度是1或者2
{
reverse_string(str + 1); //逆序中间字符串的长度,此时第一个字符在最外面,arr+1表示从下一个字符的地址开始执行
}
*(str + len - 1) = tmp; //最后一步:将最外面首位的字符依次放入最后
}
int main()
{
char arr[] = "abcdef";
reverse_string(arr);
printf("%s\n", arr);
return 0;
}
题目
//字符串左旋
//实现一个函数,可以左旋字符串中的k个字符。
//ABCD左旋一个字符得到BCDA
//左旋两个字符CDAB
void rank_arr(char * str, int k, int len)
{
//1.将前k个数依次取出,使用循环的方式
int i = 0;
for (i = 0; i < k; i++) //将前k个元素依次取出
{
char ret = *str; //将前面的元素放入一个变量中
//2.将后面的元素依次排到前面
int j = 0;
for (j = 0; j < len - 1; j++)
{
*(str + j) = *(str + j + 1);
}
//3.完成排列后将第一个元素放至最后
*(str+len-1) = ret;
}
}
int main()
{
char arr[7] = "ABCDEF";
int k = 2;
int len = strlen(arr);
//scanf("%d",&k);
rank_arr(arr, k,len);
printf("%s\n", arr);
return 0;
}
CDEFAB
练习:
//写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串
//例如:给定s1 = AABCD和s2 = BCDAA,返回1
//给定s1 = abcd和s2 = ABCD,返回0
//
//AABCD左旋一个字符得到ABCDA
//AABCD左旋两个字符得到BCDAA
//AABCD右旋一个字符得到DAABC
int rank_arr(char* str1, char * str2, int len)
{
//1.将前k个数依次取出,使用循环的方式
int i = 0;
for (i = 0; i < len; i++) //将前k个元素依次取出
{
char ret = *str1; //将前面的元素放入一个变量中
//2.将后面的元素依次排到前面
int j = 0;
for (j = 0; j < len - 1; j++)
{
*(str1 + j) = *(str1 + j + 1);
}
//3.完成排列后将第一个元素放至最后
*(str1 + len - 1) = ret;
if (strcmp(str1, str2) == 0) //使用字符串比较函数
{
return 1; //此时函数将返回
}
}
return 0;
}
int main()
{
char arr1[10] = "AABCD";
char arr2[10] = "BCDAA";
int len = strlen(arr1);
rank_arr(arr1, arr2, len);
int ret = rank_arr(arr1, arr2, len);
if (ret == 1)
{
printf("yes\n");
}
else
printf("no\n");
return 0;
}
yes