这里是面试常见的字符串相关题目。
主要是字符串的移动与翻转。
1. 实现字符串的左移与右移
这里是将左移转换成为了镜像操作。左移实际上是将左边movenum个字符挪到右边,而对整个字符串进行镜像就可以实现了。但是这个时候,挪过去的movenum个字符以及右边剩余的字符与原来的字符顺序是相反的,所以需要再对这两串字符进行镜像操作,使其顺序恢复正常。
上面说的是先镜像全部,再镜像分部。而实际操作中先镜像分部操作上会更方便一点并且不会影响最终结果,所以下面的实现是先镜像分部的。
#include <stdio.h>
#include <string.h>
void mirrorstr(char *str, int start, int end)
{
char tmp;
while (start < end) {
tmp = str[start];
str[start] = str[end];
str[end] = tmp;
start++;
end--;
}
return;
}
// movenum为负数时为右移,为正时是左移
void movestr(char *str, int movenum)
{
int len = strlen(str);
if (len <= 1) {
return;
}
int realmovenum = movenum % len;
if (realmovenum < 0) {
realmovenum = realmovenum + len;
}
if (realmovenum == 0) {
return;
}
mirrorstr(str, 0, realmovenum - 1);
mirrorstr(str, realmovenum, len - 1);
mirrorstr(str, 0, len - 1);
return;
}
int main()
{
char a[] = "qwerty123456";
char b[] = "q";
char c[] = "qe";
printf("a %s\n", a); // 输出:a qwerty123456
movestr(a, 2);
printf("a %s\n", a); // 输出:a erty123456qw
movestr(a, 0);
printf("a %s\n", a); // 输出:a erty123456qw
movestr(b, 3);
printf("b %s\n", b); // 输出:b q
movestr(c, 1);
printf("c %s\n", c); // 输出:eq
movestr(a, -5);
printf("a %s\n", a); // 输出:456qwerty123
movestr(c, -1);
printf("c %s\n", c); // 输出:qe
return 0;
}
2. 将字符串中的所有单词进行翻转
如“how are you”翻转结果为“uoy era woh”。这个就是找单词然后翻转了。
#include <stdio.h>
#include <string.h>
void rotateword(char *str)
{
if (NULL == str) {
return;
}
while (*str != '\0') {
if (*str != ' ') {
char *start = str;
char *end = str + 1;
while (*end != ' ' && *end != '\0') {
end++;
}
str = end;
end--;
char tmp;
while (start < end) {
tmp = *start;
*start = *end;
*end = tmp;
start++;
end--;
}
}
else {
str++;
}
}
}
int main()
{
char a[] = "i love you";
rotateword(a);
printf("%s\n", a); // 输出:i evol uoy
char b[] = "i ";
rotateword(b);
printf("%s\n", b); // 输出:i
char c[] = " i love you ";
rotateword(c);
printf("%s\n", c); // 输出: i evol uoy
return 0;
}