反轉字串的簡單方法如下:
const test = 'hello';
let i = 0;
let j = test.length - 1;
while (i < j) {
let temp = test[i];
test[j] = test[i];
test[i] = temp;
i ;
j--;
}
console.log(test);
如果我們嘗試使用索引訪問字串,它作業正常。例如console.log(test[2])退貨'l'
但是使用上述方法反轉字串會回傳未更改的字串'hello'。我們需要使用一個陣列,反轉它,然后加入它以回傳反轉的字串。但在這種情況下,我們將使用額外的空間。我們可以在不使用額外空間的情況下做到這一點嗎?
uj5u.com熱心網友回復:
字串在 JavaScript 中是不可變的。因此,它們不能就地更改。任何新字串都需要新的記憶體分配,即使做一些簡單的事情
const str1 = "hello";
const str2 = str[0];
在記憶體中留下兩個字串:"hello"和"h"。
由于任何生成字串的嘗試都將創建至少一個新字串,因此如果不為字符反轉的新字串分配空間,就不可能反轉字串。
因此,此任務的最小空間復雜度是O(n)- 與字串長度成線性關系。創建一個可以就地重新排列然后組合回反向字串的陣列可以實作這一點。
uj5u.com熱心網友回復:
這是一種遞回方式:
const rev = s => s.length>1 ? s.at(-1) rev(s.slice(0,-1)) : s;
console.log(rev("This is a test string."))
uj5u.com熱心網友回復:
您問題的最后一行意味著答案是否定的。我們不能在不使用額外空間的情況下做到這一點 [in userland JS]。
但是,如果我們依賴用系統編程語言撰寫的函式,我們可以做到這一點。這是 V8 用于Array#join. 在這種語言中,可以逐步構建反轉字串的二進制表示,并在最后一步簡單地將其轉換為 UTF-16 字串。我認為這近似于Array#join引擎蓋下的作用。
如果您的要求只是為了避免使用陣列,則以下簡單地從輸入字串的末尾連續提取代碼單元并從中構建一個新字串。
這將與代理對(例如表情符號)和字素簇一起失敗。
const reverse = (s) => {
let result = ''
for(let x = s.length-1; x >= 0; x--) {
result = s[x]
}
return result
}
console.log(reverse('hello'))
uj5u.com熱心網友回復:
hacky for 回圈怎么樣?
const rev = (str) => {
for(var i = str.length - 1; i >= 0; i--) {
str = str[i];
}
return str.slice(str.length / 2, str.length);
}
console.log(rev("t"));
console.log(rev("te"));
console.log(rev("tes"));
console.log(rev("test"));
uj5u.com熱心網友回復:
OP
“我們可以在不使用額外空間的情況下做到這一點嗎?”
不。
無論如何...基于 OP 的while方法,這次不會嘗試更改字符,而是以編程方式a)從輸入值中逐個字符洗掉,同時b)連接反轉的結果字串 ...
function reverseStringWithoutHelpOfArray(value) {
value = String(value); // let i = 0;
let result = ''; // let j = test.length - 1;
// while (i < j) {
while (value) { // let temp = test[i];
result = result value.slice(-1); // test[j] = test[i];
value = value.substring(0, value.length - 1); // test[i] = temp;
} // i ; j--;
return result; // }
}
console.log(
reverseStringWithoutHelpOfArray('hallo')
);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/522509.html
上一篇:如何使彈出視頻回應于移動設備
