CSDN作者panzii666
我这次对句子算法的理解希望对大家有所帮助。比较烧脑,大家多多支持我,谢谢!
标题一 逆置字符串算法
1.方法一
void reverse_string(char arr[])
{
char* left = arr;
char* right = arr + strlen(arr) - 1;
while (left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
int main()
{
char arr[] = "I like beijing.";
reverse_string(arr);
printf("%s",arr);
return 0;
}
逆置字符串,循环的方式实现非常简单
- 给两个指针,left放在字符串左侧,right放在最后一个有效字符位置
- 交换两个指针位置上的字符
- left指针往后走,right指针往前走,只要两个指针没有相遇,继续2,两个指针相遇后,逆置结束
2.方法二 递归
对于字符串“abcdefg”,递归实现的大概原理:
- 交换a和g,
- 以递归的方式逆置源字符串的剩余部分,剩余部分可以看成一个有效的字符串,再以类似的方式逆置
void reverse_string(char* arr)
{
int len = strlen(arr);
char tmp = *arr;
*arr = *(arr+len-1);
*(arr+len-1) = '\0';
if(strlen(arr+1)>=2)
reverse_string(arr+1);
*(arr+len-1) = tmp;
}
int main()
{
char arr[] = "I like beijing.";
reverse_string(arr);
printf("%s", arr);
return 0;
}```
```c
在这里插入代码片
标题二 句子的逆置算法
算法一
1.先逆置整个句子。
2.再逆置每个单词。
#include<stdio.h>
#include<string,h>
void reverse(char* source, char* over)
{
char temp = 0;
while (source <= over)
{
temp = *source;
*source = *over;
*over = temp;
source++;
over--;
}
}
int main()
{
char arr[] = "I like beijing.";
int len =strlen(arr);
char* start = arr;
char* dest = arr;
while (*dest)
{
while (*dest != ' ' && *dest != '\0')
{
dest++;
}
reverse(start, dest - 1);
if (*dest == ' ')
{
dest++;
}
start = dest;
}
start = arr;
reverse(start, dest - 1);
printf("%s", arr);
return 0;
}
算法二
1.先逆置每个单词。
2.再逆置整个句子。
#include<stdio.h>
#include<string.h>
void reverse(char* start, char* dest)
{
int temp = 0;
while (start < dest)
{
temp = *start;
*start = *dest;
*dest = temp;
start++;
dest--;
}
}
int main()
{
char arr[] = "I like beijing.";
int len = strlen(arr);
reverse(arr, arr + len - 1);
char* source = arr;
char* over = arr;
while (*over)
{
while (*over != ' ' && *over != '\0')
{
over++;
}
reverse(source, over - 1);
source = over + 1;
if (*over == ' ')
over++;
}
printf("%s", arr);
return 0;
}
算法三
1.定义两个二维数组。
2.在放有字符串的数组中从后往前找每个单词。
3.把每个单词找完就拷贝到另一个数组中。
从后往前找的好处就是不用再逆置整个句子了。
#include<stdio.h>
#include<string.h>
int main()
{
char str1[] = "I like beijing.";
char str2[100] = { 0 };
int len = strlen(str1);
char* start = str1 + len - 1;
char* dest = str1 + len - 1;
while (start!=str1)
{
while (*dest != ' ')
{
dest--;
if (dest == str1)
{
break;
}
}
while (*dest == ' ')
{
strcat(str2, dest);
*dest = '\0';
}
if (dest == str1)
{
*(dest+1) = '\0';
strcat(str2, dest);
}
start = dest;
}
printf("%s", str2);
return 0;
}
希望各位大哥大姐觉得对自己由用处的就麻烦关注一下下,谢谢哈!
这些算法我想了很多次,并且很烧脑,大家支持一下,谢谢!