我很驚訝為什么在我的 reduce 功能中將布林值附加到當前值。
var romanToInt = function (s) {
const DICT = {
I: 1,
V: 5,
X: 10,
L: 50,
C: 100,
D: 500,
M: 1000,
}
let reversedArr = s.split('').reverse()
reversedArr
return reversedArr.reduce((sum, cur, i, arr) => {
let value = DICT[cur]
// check if preceeding numeral subtracts
if ((arr[i] = arr[i - 1] === 'VI') && i != 0) {
sum -= value
} else {
// Set sum as the first
sum = value
}
return sum
}, 0)
}
console.log(romanToInt('III'))
為什么這個運算式的計算(curr = arr[i - 1] === 'VI')結果為假、真、真?
3 次迭代后 curr 的值為Ifalse, Ifalse, Ifalse。這是怎么回事?
我想要做的就是檢查當前值是否和前面的值等于字串“VI”
uj5u.com熱心網友回復:
x = y等價于x = x y,并且整個賦值運算式的計算結果為右側的值:x y。如果x y為真,則整個結果運算式將為真。
出于同樣的原因,您的
if ((arr[i] = arr[i - 1] === 'VI') && i != 0) {
不是在做你認為的事情。
看起來您根本不需要在這里分配陣列索引 - 只需在那里進行比較,如果滿足條件,則更改sum(不更改回圈內的任何其他內容)。
var romanToInt = function (s) {
const DICT = {
I: 1,
V: 5,
X: 10,
L: 50,
C: 100,
D: 500,
M: 1000,
}
const reversedArr = s.split('').reverse();
return reversedArr.reduce((sum, cur, i, arr) => {
let value = DICT[cur]
// check if preceeding numeral subtracts
if ((arr[i] arr[i - 1] === 'VI') && i != 0) {
sum -= value
} else {
// Set sum as the first
sum = value
}
return sum
}, 0)
}
console.log(romanToInt('III'))
但是您仍然有辦法修復演算法的其余部分。這是一個很好的方法。
uj5u.com熱心網友回復:
較短的版本;)
const
DICT = { I: 1, V: 5, X: 10, L: 50, C: 100, D: 500, M: 1000 }
, Narr = [ 'IV','IX', 'XL', 'XC', 'CD', 'CM' ]
;
const romanToInt = s =>
[...s].reverse().reduce((sum, curr, i, {[i-1]:prev}) =>
sum (Narr.includes(`${curr}${prev}`) ? -DICT[curr] : DICT[curr]) , 0)
console.log('III', romanToInt('III'))
console.log('IV', romanToInt('IV'))
console.log('VII', romanToInt('VII'))
console.log('IX', romanToInt('IX'))
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/369746.html
標籤:javascript 数组 算法 降低
上一篇:無法將此頁腳正確固定到視口底部
下一篇:如何在用戶完成任務之前鎖定內容?
