2017-10-08 58 views
0

我寫了一個名爲reverseStr的函數,它接受一個字符串作爲參數,並返回字符串,但字符反向。JS:使用嵌套循環翻轉字符串不起作用

例如:reverseStr('bootcamp'); =>'pmactoob'

以下是我的程序:

function reverseStr(str) 
 
{ 
 
\t var splitStr = str.split(""); 
 
\t console.log(splitStr); 
 
\t var reverseString = []; 
 
\t for(var i = 0; i <= splitStr.length -1 ; i++) 
 
\t { 
 
\t \t for(var j = splitStr.length - 1; j >= 0; j--) 
 
\t \t { 
 
\t \t \t reverseString[i] = splitStr[j] 
 
\t \t } 
 
\t } 
 

 
\t return reverseString.toString().replace(/[&\/\\#,+()$~%.'":*?<>{}]/g, ''); 
 
}

如果我運行函數reverseStr("bootcamp")返回bbbbbbbb。 有沒有人看到代碼的問題?

注:我DONOT要使用REVERSE()內置功能

然而,我發現成功用下面的代碼但仍需要回答我最初的問題

function reverseStr(str) 
 
{ 
 
\t var splitStr = str.split(""); 
 
\t reverseStr = ""; 
 
\t for(var i = splitStr.length - 1; i >= 0 ; i = i - 1) 
 
\t { 
 
\t \t reverseStr += splitStr[i]; 
 
\t } 
 

 
\t return reverseStr; 
 
}

+0

你還需要一個你最初的問題的答案嗎? – Aydin4ik

+0

yes please @Aydin – socrates

回答

1

您不需要重複遍歷字符,即不需要嵌套for循環。迭代一次搶字符以相反的順序是這樣的:

function reverseStr(str) 
{ 
    var splitStr = str.split(""); 
    console.log(splitStr); 
    var reverseString = []; 
    for(var i = 0, j=splitStr.length-1; i <= splitStr.length -1 ; i++, j--) 
    { 
      reverseString[i] = splitStr[j] 
    } 

    return reverseString.toString().replace(/[&\/\\#,+()$~%.'":*?<>{}]/g, ''); 
} 

您可以看到,這裏的循環繼續,只要i <= splitStr.length -1,即字符串的長度。這足以獲得鏡像字符(iArray.length-i)。

這裏是一個工作片斷演示:

var reverseStr = function(str) { 
 
    let result = String(); 
 
    for(let i = str.length-1; i >= 0; i--) { 
 
    result += str.charAt(i); 
 
    } 
 
    return result.replace(/[&\/\\#,+()$~%.'":*?<>{}]/g, ''); 
 
} 
 
$('button').click(function() { 
 
    $('.result').text(reverseStr($('#str').val())); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
    <input type="text" id="str"> 
 
    <button>Reverse it</button> 
 
    <div class="result"></div>

也許更優雅的方式來達到同樣的(除了Array.prototype.reverse())將使用String.prototype.chatAt()。這樣可以避免兩次數組之間的轉換,併爲您節省一個變量。當然,代碼更短,更明顯。

var reverseStr = function(str) { 
 
    let result = String(); // An empty string to store the result 
 
    for(let i = str.length-1; i >= 0; i--) { // Iterate backwards thru the chars and add to the result string 
 
    result += str.charAt(i); 
 
    } 
 
    return result.replace(/[&\/\\#,+()$~%.'":*?<>{}]/g, ''); // Original return method of the author 
 
} 
 
$('button').click(function() { 
 
    $('.result').text(reverseStr($('#str').val())); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
    <input type="text" id="str"> 
 
    <button>Reverse it</button> 
 
    <div class="result"></div>

+0

我在'i <= splitStr.length -1;' – socrates

+0

之後出現錯誤我添加了另一種方式來執行代碼應該執行的操作 - 這可能是實現任務的更簡潔的方式。這不是對你的問題的直接回答 - 只是指出,有人可能會覺得它有用。 – Aydin4ik

0

問題是,您的嵌套for循環在其返回到外部之前運行其整個過程for循環。所以,它只是重複一個字符的次數等於該長度的次數。而不是有另一個for循環,只需在外部for循環內爲j添加一個簡單的計數器j++,並將該值與i值一起使用。

0

爲原來的海報,想想看:

如果您知道原始字符串的長度,所以你知道原始字符串內最後位置的偏移量。

按相反順序迭代原始字符串,將當前位置的值附加到新字符串中。新的字符串將是原來的相反。

0

艾登的例子基本上是正確的。這裏是我非常相似的版本,有評論:

function reverseString(inputString) { 
    // create a new empty string 
    var newString = ""; 

    // iterate through the characters of the string in reverse order, 
    // appending to the new string 
    for (var i = inputString.length - 1; i >= 0; i--) { 
     newString += inputString[i]; 
    } 

    return newString; 
} 

console.log(reverseString('bootcamp'));