【劍指offer】左旋轉字串

蘭亭風雨發表於2014-05-29

轉載請註明出處:http://blog.csdn.net/ns_code/article/details/27366485

題目描述:
組合語言中有一種移位指令叫做迴圈左移(ROL),現在有個簡單的任務,就是用字串模擬這個指令的運算結果。對於一個給定的字元序列S,請你把其迴圈左移K位後的序列輸出。例如,字元序列S=”abcXYZdef”,要求輸出迴圈左移3位後的結果,即“XYZdefabc”。是不是很簡單?OK,搞定它!
輸入:
多組測試資料,每個測試資料包含一個字元序列S和非負整數K。其中S的長度不超過1000。
輸出:
對應每個測試案例,輸出新序列。
樣例輸入:
UDBOJ 4
abba 1
樣例輸出:
JUDBO
bbaa
    這道題之前在Cracking the Coding interview上做過類似的,一樣的三次反轉,即可得到,時間複雜度為O(n),空間複雜度為O(1)。這道題在九度OJ上測試,主要要考慮移動的位數大於字串長度時的情況,取餘即可。

    AC程式碼如下:

#include<stdio.h>
#include<string.h>

void Swap(char *a,char *b)
{
	int temp = *a;
	*a = *b;
	*b = temp;
}

/*
翻轉字串中從start到end的這部分
*/
void ReverseString(char *str,int start,int end)
{
	while(start < end)
	{
		Swap(&str[start],&str[end]);
		start++;
		end--;
	}
}

/*
求左旋k位後得到的字元
*/
void ROLString(char *str,int k)
{
	if(str == NULL || k<=0)
		return;
	
	int len = strlen(str);
	//要考慮k大於len的情況
	k = k%len;
	if(k == 0)
		return;

	ReverseString(str,0,k-1);
	ReverseString(str,k,len-1);
	ReverseString(str,0,len-1);
}

int main()
{
	char str[1010];
	int k;
	while(scanf("%s %d",str,&k) != EOF)
	{
		ROLString(str,k);
		puts(str);
	}
	return 0;
}
/**************************************************************
    Problem: 1362
    User: mmc_maodun
    Language: C
    Result: Accepted
    Time:60 ms
    Memory:912 kb
****************************************************************/

相關文章