在javascript

时间:2017-01-17 22:36:56

标签: javascript arrays shift alphabet

好吧,所以我不知道标题是否正确,但我正在努力做的是找到一个算法来做这样的事情。所以我们有一个输入数组,例如:[' a'' b',' c'' d',...]直到字母表的结尾,以及要转移的数字。我必须输出数组,如[' x',' y',' z',' a',' b&# 39;,' c',...]如果我有一个3号移位; 关于如何做的任何想法? 我试过了:

function solve(args)
{
    let arr = ['a', 'b', 'c', 'd'];
    let number = 3;

    for (let i = 0; i < arr.length; i++)
    {
        if (typeof arr[i + 1] === undefined)
        {
            arr[0] = arr[i];
        }
        else if (typeof arr[i - 1] === undefined)
        {
            arr[arr.length - 1] = arr[0];
        }
        else
        {
            arr[i] = arr[i + 1];
        }
    }
    console.log(arr);
}

5 个答案:

答案 0 :(得分:6)

除了它打印[d,e,f ... a,b,c]

之外几乎就是这样
for(var i = 0; i < number; i++){
   arr.push(arr.shift());
}

正如评论中所指出的那样(感谢@dtkaias):结果[x,y,z,a,b,c...]

for(var i = 0; i < number; i++){
   arr.unshift(arr.pop());
}

unshift函数在数组前面添加一个元素,而pop函数删除最后一项,因此它将最后一项移到前面number次循环。

答案 1 :(得分:4)

您正在寻找的工具是.slicehttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice),和 .concathttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/concat)。

function getShiftedArray (arr, n) {
    var i = arr.length - n;
    var front = arr.slice(0, i);
    var back = arr.slice(i);
    return back.concat(front);
}

答案 2 :(得分:1)

这是一个将结果复制到新数组的解决方案。时间和空间复杂度为O(arr.length),如果您正在寻找一个可以改变阵列并且时间复杂度O(x)的解决方案,那么请参阅Patrick的答案。

&#13;
&#13;
function rotate(arr, x) {
  return arr.slice(x).concat(arr.slice(0, x));
}

let arr = "abcdefghijkl".split("");

console.log(rotate(arr, -3).join(""));
&#13;
&#13;
&#13;

答案 3 :(得分:1)

Array.prototye.rotate()的发明可能对这项工作很有用。让我们看一个简单的实现。

&#13;
&#13;
Array.prototype.rotate = function(n) {
                           var len = this.length;
                           return !(n % len) ? this.slice()
                                             : this.map((e,i,a) => a[(i + (len + n % len)) % len]);
                         };

var   alpha = Array(26).fill().map((_,i) => String.fromCharCode(i+97)),
 rotateLeft = e => (alpha = alpha.rotate(1), alphabet.textContent = alpha.join(",")),
rotateRight = e => (alpha = alpha.rotate(-1), alphabet.textContent = alpha.join(","));

alphabet.textContent = alpha.join(",");
buttonLeft.addEventListener("click",rotateLeft);
buttonRight.addEventListener("click",rotateRight);
&#13;
<div id="alphabet"></div>
<button id="buttonLeft"><<</button>
<button id="buttonRight">>></button>
&#13;
&#13;
&#13;

答案 4 :(得分:0)

将数组拆分为2个部分,然后将它们连接起来。就是这样!

arr = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];
number = 3;

xxx = arr.slice(-number);
yyy = arr.slice(0,arr.length - number);
arr_shift = xxx.concat(yyy);

console.log(arr_shift);