整数の配列が与えられると、特定の目標に合計される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
。
$[ . . . ]
次の古い算術評価構文を表示できます。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[@]}"
構文を使用してキーのリストを取得します。