我感觉这道题用JS用天生的优势。因为JS的数组头和尾都可以进行操作。用好push和shift这道题就非常简单~
题目描述
汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!
思路分析
左移出来的n位将顺序的移入到后n位。可以想象是n个数依次从头拿出然后插入到尾部。
即在一个n次的循环中,用一个temp记下数组shift的数,并push到数组中。
具体JS代码实现1
function LeftRotateString(str, n)
{
// 判断输入为空的异常状态
if(str == null)
{
return "";
}
var strArr = new Array();
var result = "";
strArr = str.split("");
for(var j = 0; j < n; j++)
{
var temp = strArr.shift();
strArr.push(temp);
}
result = strArr.join("");
return result;
}
另一种思路
上面的做法有点依赖于数组的API。下面这个做法比较常规。
要左移前n位,相当于前n位成为了最后n位。剩下几位成了开始。那么可以先反转前N位,再反转后几位,最后将整个字符串翻转。就是最后的结果了~
具体JS代码的实现2
function LeftRotateString(str, n)
{
// write code here
if(str == null)
{
return "";
}
var strArr1 = str.split("");
reverse(strArr1,0,n-1)
reverse(strArr1,n,strArr1.length-1)
reverse(strArr1,0,strArr1.length-1)
return strArr1.join("");
}
//实现数组i-j位的翻转
function reverse(strArr,i,j)
{
while(i<j)
{
var temp = strArr[i];
strArr[i] = strArr[j];
strArr[j] = temp;
i++;
j--;
}
return strArr;
}