web-dev-qa-db-ja.com

数字の合計が一致する配列内の2つの数値の最大合計

私はこの問題を理解しようとしていますが、いくつか問題があります。 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)
4
MikeC

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
  ))
}
0
Dmitry Reutov

グループ化して、グループ化された配列から最大合計を取得できます。

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);
0
Nina Scholz
//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]
0
Md. Amirozzaman