整数の配列が与えられると、特定の目標に合計される2つの数値のインデックスが返されます。

整数の配列が与えられると、特定の目標に合計される2つの数値のインデックスが返されます。

整数の配列が与えられると、特定の目標に合計される2つの数値のインデックスが返されます。

各入力に解決策があり、同じ要素を2回使用できないと仮定できます。

例: 与えられた数値 = [2, 7, 11, 15], 宛先 = 9,

nums[0] + nums[1] = 2 + 7 = 9 なので [0, 1] が返されます。

Bashでこれを試しましたが、構文エラーのため失敗しました。論理が正しいか、構文エラーがあるか教えてください。

#!/bin/bash
# Given an array of integers, return indices of the two numbers such 
# that they add up to a specific target.

read T
nums=("2" "7" "11" "15")

for i in ${nums[@]}
do
    for j in ${nums[@]}
    do
        if [ "$i" + "$j" == $T ]
            echo "i=$i"
            echo "j=$j"
            break
        fi
    done
done

答え1

if対応する必要があり、算術テストには1がthen必要です。(( . . .))

if (( $i + $j == $T )); then

またはそれ以来

式内では、シェル変数はパラメーター拡張構文を使用せずに名前で参照することもできます。

次のように単純化できます。

if (( i + j == T )); then

SHELL GRAMMAR - Compound Commandsサブセクションを参照してくださいman bash


  1. $[ . . . ]次の古い算術評価構文を表示できます。

    if [ $[$i + $j] == $T ]; then
    

    また、合法的です。ただし、これは廃止され、新しいスクリプトには使用しないでください。

答え2

for i in "${array[@]}"ループスルー価値連想配列 1. ここで示すようにキー(インデックス)を繰り返す場合は にfor in "${!array[@]}"ありますbash

#! /bin/bash -
T=${1?Please pass a decimal integer number as argument}
nums=(2 7 11 15)
found=false

if [[ ! $T =~ ^-?[0123456789]+$ ]]; then
  printf >&2 '"%s" is not a valid integer number\n' "$T"
  exit 2
fi
  
for i in "${!nums[@]}"; do
  for j in "${!nums[@]}"; do
    if ((nums[i] + nums[j] == T)); then
      printf '%s\n' "i=$i nums[i]=${nums[i]}" "j=$j nums[j]=${nums[j]}"
      found=true
      break 2
    fi
  done
done
"$found"

引数として渡された入力番号を検証することが重要です。そうしないと、コードにランダムなコマンド実行の脆弱性が発生します。

また、bash前にゼロが付いた数字は次のように理解されます。8進数したがって、010は10ではなく8として理解されます。


¹ bash配列(例:kshの配列)まれな配列、正の整数に制限されたキーを持つ連想配列と同じです。バージョン4.0以降、bashはキーが次の順序に制限される連想配列もサポートしています。一つNUL以外のバイト以上を宣言し、declare -A同じ"${!assoc[@]}"構文を使用してキーのリストを取得します。

関連情報