行百里者半九十 —— 字符串
1、替换字符
请实现一个函数,把字符串
s
中的每个空格替换成"%20"。
先计算出字符串中空格的数量,再扩充字符串,替换空格
1 class Solution { 2 public: 3 string replaceSpace(string s) { 4 int count = 0; // 统计空格的个数 5 int sOldSize = s.size(); 6 for (int i = 0; i < s.size(); i++) { 7 if (s[i] == ' ') { 8 count++; 9 } 10 } 11 // 扩充字符串s的大小,也就是每个空格替换成"%20"之后的大小 12 s.resize(s.size() + count * 2); 13 int sNewSize = s.size(); 14 // 从后先前将空格替换为"%20" 15 for (int i = sNewSize - 1, j = sOldSize - 1; j < i; i--, j--) { 16 if (s[j] != ' ') { 17 s[i] = s[j]; 18 } else { 19 s[i] = '0'; 20 s[i - 1] = '2'; 21 s[i - 2] = '%'; 22 i -= 2; 23 } 24 } 25 return s; 27 } 28 };
2、左旋转字符串
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
最直接就是先申请一样大小的空间(C字符数组末尾有‘\0’),将数字所在位置以后的字符截断拷贝到新分配的空间,再将剩下的字符拷贝到新空间的后面,最后加上一个'\0'
1 char* reverseLeftWords(char* s, int n){ 2 int len = strlen(s); 3 4 char* p = (char*)malloc(len+1); 5 strcpy(p, s+n); //先拷贝s+n(n实际指向的位置)后的所有元素到p 6 strncpy(p+(len-n), s, n); //将剩下的元素拷贝过去 7 p[len] = '\0'; 8 return p; 9 }
还有一种巧妙做法,利用C++中的翻转函数:
- 先反转区间前n的子串
- 再反转区间n到末尾的子串
- 最后反转整个字符串
1 lass Solution { 2 public: 3 string reverseLeftWords(string s, int n) { 4 reverse(s.begin(), s.begin() + n); 5 reverse(s.begin() + n, s.end()); 6 reverse(s.begin(), s.end()); 7 return s; 8 } 9 };