私はこの問題を理解しようとしていますが、いくつか問題があります。 A
整数で構成される配列N
を指定すると、2つの数値の最大合計を返します。数字の合計が等しい2つの数値がない場合、関数は-1を返します。
たとえば、A = [51, 71, 17, 42]
は次のように出力します:93
説明:数値の合計が等しい合計のペアが2つあります:(51、42)と(17、71)、最初のペアの合計は93です。
プロセスについて少し混乱しています。これまでのところ、その配列を取得して文字列に変換してから、文字列を分割して配列を1桁の数字'5', '1'
などにしています。次にどこに進むかわかりません。配列をループして、どういうわけかnum[0]+num[1]
とnum[2] + num[3]
を比較する必要があることはわかっています。多分ループ内のループ?
どんなガイダンスもいただければ幸いです。
これが私がこれまで持ってきたものです。それは、私がすべきだと思うことの土台にすぎません。それは完全に間違っているかもしれませんが、私は正しい方向に向かっていると思います!
A = [51, 71, 17, 42]
function sumOfTwoEqNum(a){
a = a.toString().split('').filter(e => e !== ',').map(Number)
for(let i =0; i < a.length; i++){
return a[i] + a[i +1]
}
console.log(a)
}
sumOfTwoEqNum(A)
1行のソリューション=)
function sum(arr) {
return Math.max(...Object.entries(
arr.reduce((agg, v) => {
const sum = v.toString().split('').map(v => +v).reduce((agg, v) => agg + v)
return Object.assign(agg, { [sum]: [...(agg[sum] || []), v] })
}, {})
).map(([_, values]) =>
values.length > 1 ? (arr => arr[0] + arr[1])(values.sort((a, b) => b - a)) : 0
))
}
グループ化して、グループ化された配列から最大合計を取得できます。
const add = (a, b) => a + b,
sum = s => Array.from(s.toString(), Number).reduce(add);
var array = [51, 71, 17, 42],
result = array
.reduce((r, v) => {
var temp = r.find(([q]) => sum(q) === sum(v));
if (!temp) r.Push([v]);
else temp.Push(v);
return r;
}, [])
.reduce((a, b) => a.reduce(add) > b.reduce(add) ? a : b);
result = result.length !== 2
? -1
: result.reduce(add);
console.log(result);
//param index of return occurence from 0,1,3,...
function findAPair(index,sum,arr){
//sorted min to max
arr.sort((a,b) => {return a-b})
const result = arr.filter(i => arr.includes(sum-i));
// result [3,15,42,51,78,90]
return [result[index],result[result.length-1-index]];
}
const Arr = [51, 71, 17, 42,90,3,78,15];
const targetSum = 93
console.log(findAPair(0,targetSum,Arr))
//[3,90]
console.log(findAPair(1,targetSum,Arr))
//[15,78]