Problem 4:
Given a string and an offset, rotate string by offset. (rotate from left to right)
Example
Given "abcdefg"
.
offset=0 => "abcdefg"
offset=1 => "gabcdef"
offset=2 => "fgabcde"
offset=3 => "efgabcd"
class Solution { public: /* * @param str: An array of char * @param offset: An integer * @return: nothing */ void rotateString(string &str, int offset) { // write your code here while(offset>0){ int x = str.length(); char m = str.at(x-1); for(int i = x-1 ; i>0;i--){ str[i] = str[i-1]; } str[0] = m; } } };
然后我就去翻c++ string库的函数了... 再观察case规律发现,只是相对位置发生了变化,本质上是将原字符串根据offset拆分成前后两片,再调换位置的过程,所以写了下面的代码:
class Solution { public: /* * @param str: An array of char * @param offset: An integer * @return: nothing */ void rotateString(string &str, int offset) { // write your code here int x = str.length(); string sub_1 = str.substr(x-offset,offset); string sub_2 = str.substr(0,x-offset); sub_1 += sub_2; str = sub_1; } };结果跑到一半就跪了,看到case是这样的:
嗯...果然自己想得不周到,加上了
offset = offset%x;进行处理,后来又在一个空字符串上坑了一把,最后AC的代码如下:
class Solution { public: /* * @param str: An array of char * @param offset: An integer * @return: nothing */ void rotateString(string &str, int offset) { // write your code here int x = str.length(); if(x > 0){ offset = offset%x; string sub_1 = str.substr(x-offset,offset); string sub_2 = str.substr(0,x-offset); sub_1 += sub_2; str = sub_1; } } };感悟:多看函数库,把程序方方面面想到,尽量一把AC,摒弃for循环。