最近开始读July的编程之法(面试和算法心得),开始把里面的小例子与与其中小练习题拿出来与大家分享
题目描述:
给定一个字符串,要求将字符串前面的若干字符转移到字符串的尾部。例如,将字符串“abcdef”的前3个字符串’a”b”c’移到字符串的尾部,那么,原字符串将变为“defabc”。
解法一:蛮力移位(将字符一个个移到最后,此处省略)
解法二:三步翻转
三个步骤:
(1)将原字符串分为X和Y两个部分,其中X为abc,Y为def
(2)将X的字符串进行翻转,再将Y的字符串进行翻转
(3)整体翻转
参考代码
#include <stdio.h>
#include <stdlib.h>
void reverseString(char* s,int from,int to){
char temp;
while(from < to){
temp = s[to];
s[to] = s[from];
s[from] = temp;
from ++;
to --;
}
}
int main()
{
char s[100]="asdfgjkl";
printf("%s\n",s);
reverseString(s,0,2);
reverseString(s,3,7);
reverseString(s,0,7);
printf("%s\n",s);
return 0;
}
一开始,将s设置成指针,每次都会导致程序崩溃,才想起来指针是静态变量,将s改为一个大数组即解决问题。
举一反三之单词翻转
题目要求:
输入一个英文单词,翻转句子中单词的顺序。要求单词内字符的顺序不变,句子中的单词以空格符隔开。为简单处理,标点符号和普通字母一样处理。例如,若输入“i am a student.”,则输出“student. am a i”。
思路:
先整体翻转,再每个单词内部进行翻转。
参考代码:
#include <stdio.h>
#include <stdlib.h>
void reverseString(char *s,int from, int to){
while(from < to){
char temp = s[from] ;
s[from] = s[to];
s[to] = temp;
from ++;
to --;
}
}
void reverseWord(char *s){
reverseString(s,0,strlen(s)-1);
int space = 0,i;
for(i = 0; i < strlen(s) ; i++){
if(s[i] == ' '){
reverseString(s,space,i -1);
space = i;
}
}
}
int main()
{
char s[100] = "i am a student.";
printf("%s\n",s);
reverseWord(s);
printf("%s",s);
return 0;
}