给定一个整数数组,返回两个数字的索引,使它们相加达到特定目标。
您可以假设每个输入都有一个解决方案,并且您不能两次使用相同的元素。
示例:给定 nums = [2, 7, 11, 15],target = 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
需要一个相应的then
,并且您应该1用于(( . . .))
算术测试,即
if (( $i + $j == $T )); then
或自从
在表达式中,shell 变量也可以通过名称引用,而不使用参数扩展语法。
你可以将其简化为
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
将带有前导零的数字理解为八进制数字,因此 010 将被理解为 8,而不是 10。
¹ bash 数组,如 ksh 中的数组稀疏数组,就像键仅限于正整数的关联数组一样。从 4.0 版开始,bash 还支持关联数组,其键仅限于以下序列一或更多非 NUL 字节,用 声明declare -A
,并使用相同的"${!assoc[@]}"
语法来获取键列表。