汕头网站推广公司网站排名提升软件
题目:字符串的循环右移 ,如字符串"abcdefg"循环右移2个字符变成"fgabcde"
分析:方法(1):一个一个移动(每次将最后一个字符单独保存,将剩下的字符挨着后移一个,再将保存的这个字符放到最前面空出来的位置...)方法(2):方法(1)的优化,由于一个一个移效率较低,我们可以计算出要移动的字符数,然后将要移动的字符拷贝到一个临时空间中,然后将剩下的一次性移到它最终该在的位置,在将临时空间的那部分字符串放到前面腾出来的位置.方法(3):方法(2)的优化,假如字符串长为len,那么右移n个字符,就相当于左移动len-n个字符,那么当n>len2/2时,我们可以通过左移来实现同样的效果,并且比直接右移要效率高一点。方法(4):先分别局部倒置字符串,再整体倒置字符串。如"abcdefg"右移2位,先将"abcde"倒置为"edcba",将"fg"倒置为"gf",再整体倒置为"fgabcde"
方法(1):
void LoopMoveStr1(char* str, int n)
{assert(str);assert(n > 0);int len = strlen(str);if (n > len)//当要移动的个数>字符串长度时,模一下,不做不必要的移动{n = n % len;}for (int i = 0; i < n; i++){char tmp = str[len-1];//保存最后一个元素memmove(str+1, str, sizeof(char)*(len-1));str[0] = tmp;}
}
方法(2):
void LoopMoveStr2(char* str, int n)
{assert(str);assert(n > 0);int len = strlen(str);if (n > len)//当要移动的个数>字符串长度时,模一下,不做不必要的移动{n = n % len;}//准备存放要被移的n个字符的临时空间char* tmp = (char*)malloc(sizeof(char)*n);//将后n个字符拷贝到临时空间memcpy(tmp, str+(len-n), sizeof(char)*n);//一次性移动剩下的字符memmove(str+n, str, sizeof(char)*(len-n));//将临时空间的那部分字符串考回来memcpy(str, tmp,sizeof(char)*n);
}
方法(3):
void LoopMoveStr3(char* str, int n)
{assert(str);assert(n > 0);int len = strlen(str);if (n > len)//当要移动的个数>字符串长度时,模一下,不做不必要的移动{n = n % len;}if (n <= len / 2)//右移(和方法2逻辑一样){//准备存放要被移的n个字符的临时空间char* tmp = (char*)malloc(sizeof(char)*n);//将后n个字符拷贝到临时空间memcpy(tmp, str + (len - n), sizeof(char)*n);//一次性移动剩下的字符memmove(str + n, str, sizeof(char)*(len - n));//将临时空间的那部分字符串考回来memcpy(str, tmp, sizeof(char)*n);}else//右移数超过字符串长度的一半时候,右移n个字符,相当于左移len-n个字符{char* tmp = (char*)malloc(sizeof(char)*(len - n));memcpy(tmp, str,sizeof(char)*(len-n));memmove(str, str+(len-n), sizeof(char)*n);memcpy(str+n, tmp, sizeof(char)*(len - n));}
}
方法(4):
//先写一个字符串的倒置函数
void reverse_str1(char* str, int begin, int end)
{assert(str);while (begin < end){char tmp = str[begin];str[begin] = str[end];str[end] = tmp;begin++;end--;}
}
void LoopMoveStr4(char* str, int n)
{assert(str);assert(n > 0);int len = strlen(str);if (n > len)//当要移动的个数>字符串长度时,模一下,不做不必要的移动{n = n % len;}//两部分局部倒置reverse_str1(str, 0, len-n-1);reverse_str1(str,len-n, len-1);//最后整体逆置reverse_str1(str, 0, len-1);}