字符串左移:
void *pszStringRotate(char *pszString, intnCharsRotate)
比如ABCDEFG,移3位变DEFGABC,要求空间复杂度O(1),时间复杂度O(n)。
#include <stdio.h> #include <stdlib.h> void reverse(char *str_start,char * str_end){ if(str_start == NULL || str_end == NULL ){ return ; } while(str_start<str_end){ char tmp=*str_end; *str_end=*str_start; *str_start=tmp; str_end--; str_start++; } } char * leftrotatestring(char *str,int n){ //注意保存备份 char *back_str=str; if(str != NULL){ int i=0; while(*str!='\0'){ i++; str++; } char * pFirstStart=back_str; char * pFirstEnd=back_str+n-1; char * pSecondStart=back_str+n; char * pSecondEnd=back_str+i-1; //前面部分 reverse(pFirstStart,pFirstEnd); //printf("%s\n",*back_str); //后面部分 reverse(pSecondStart,pSecondEnd); //整体 reverse(pFirstStart,pSecondEnd); } return back_str; } int main() { char str[10]="ABCD"; printf("%s\n",str); char* getstr = leftrotatestring(str,2); printf("Hello world! %s\n",getstr); printf("Hello world! %s\n",str); return 0; }
}
int length = 0;
while(*pszString != '\n')
{
length++;
}
reversal(pszString,nCharsRotate);
reversal(pszString+nCharsRotate,length - nCharsRotate);
reversal(pszString,length);
return pszString;
}
#include <iostream> #include <cstring> using namespace std; //反转单词 void ReverseWord(char* words,int begin,int end){ int temp; if(words == NULL || begin > end || begin < 0){ return; } //反转 while(begin < end){ temp = words[begin]; words[begin] = words[end]; words[end] = temp; begin ++; end --; } } char *pszStringRotate(char *pszString, int nCharsRotate){ nCharsRotate = nCharsRotate % strlen(pszString); if(pszString == nullptr){ return ""; }//if int len = strlen(pszString); ReverseWord(pszString,0,nCharsRotate-1); //反转剩余 ReverseWord(pszString,nCharsRotate,len-1); //全部反转 ReverseWord(pszString,0,len-1); return pszString; } int main() { int i,n; char* str = (char*)malloc(sizeof(char)*1001); while(scanf("%s",str) != EOF){ scanf("%d",&n); //左旋转 //注意一下n需要取余就可以了,不能超过字符串自身的长度 str = pszStringRotate(str,n); //输出 for(i = 0;i < strlen(str);i++){ printf("%c",str[i]); } printf("\n"); }//while return 0; }
void *pszStringRotate(char *pszString, intnCharsRotate) { char *start1 = pszString; char *start2 = pszString; char *tail = pszString + intnCharsRotate; int n = 0; while (*start1++ != '\0') { n++; } for (int i = 0 ; i < intnCharsRotate; i++) { char t = *start1; *start1++ = *tail++; *(start2 + n - (intnCharsRotate - i)) = t; } }
void *pszStringRotate(char *pszString, int nCharsRotate){ int len = strlen(pszString); reverse(pszString, 0, nCharsRotate); reverse(pszString, nCharsRotate -1, len); reverse(pszString, 0, len); } void reverse(char *pszString, int start, int end){ while(start < end-1){ swap(pszString[start], pszString[end]); } }
void *pszStringRotate(char *pszString, int nCharsRotate) { int len = strlen(pszString); for (int i = nCharsRotate; i < len; i++) { char temp = pszString[i]; pszString[i] = pszString[i - nCharsRotate]; pszString[i - nCharsRotate] = temp; } for (int i = len - nCharsRotate; i < len; i++) { char temp = pszString[i]; pszString[i] = pszString[len - 1]; pszString[llen - 1] = temp; } }
ABCDEFG
第一步:局部翻转
ABC DEFG == = 》 CBA GFED
第二步:整体翻转
CBA GFED == = 》 DEFGABC