问题:
编写一个函数,作用是把一个char组成的字符串循环右移m个。比如原来是”abcdefghi”,如果m=2,移位后应该是“hiabcdefg”。
解法:
(解法一)使用strcpy
void rightShifting(char *s, int step) {
int n = strlen(s)-step;
char tmp[strlen(s) + 1];
strcpy(tmp, s + n);
strcpy(tmp + step, s);
tmp[strlen(s)] = '\0';
strcpy(s, tmp);
}
int main() {
char s[] = "abcdefghi";
int m = 2;
rightShifting(s,m);
cout<<s<<endl;
return 0;
}
(解法二)使用memcpy
void rightShifting(char *s, int step) {
int n = strlen(s) - step;
char tmp[strlen(s) + 1];
memcpy(tmp, s + n, step);
memcpy(tmp + step, s, i_n);
tmp[strlen(s)] = '\0';
memcpy(s, tmp,strlen(tmp)+1);
}
int main() {
char s[] = "abcdefghi";
int m = 2;
rightShifting(s,m);
cout<<s<<endl;
return 0;
}
(解法三)三步反转
(1)将原字符串分为X和Y两个部分
(2)将X的所有字符反转,再将Y的所有字符反转
(3)最后,将上述步骤得到的整个字符串进行整体反转
//三步反转
void reverse(char *s, int from, int to) {
while (from < to) {
char tmp = s[from];
s[from++] = s[to];
s[to--] = tmp;
}
}
void rightShifting(char *s,int n, int m) {
m %= n;
reverse(s, 0, n - m - 1);
reverse(s, n - m, n - 1);
reverse(s, 0, n - 1);
}
int main() {
char s[] = "abcdefghi";
int m = 2;
rightShifting(s,strlen(s),m);
cout<<s<<endl;
return 0;
}