给定一个整数数组,返回两个数字的索引,使它们相加达到特定目标

给定一个整数数组,返回两个数字的索引,使它们相加达到特定目标

给定一个整数数组,返回两个数字的索引,使它们相加达到特定目标。

您可以假设每个输入都有一个解决方案,并且您不能两次使用相同的元素。

示例:给定 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


  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将带有前导零的数字理解为八进制数字,因此 010 将被理解为 8,而不是 10。


¹ bash 数组,如 ksh 中的数组稀疏数组,就像键仅限于正整数的关联数组一样。从 4.0 版开始,bash 还支持关联数组,其键仅限于以下序列或更多非 NUL 字节,用 声明declare -A,并使用相同的"${!assoc[@]}"语法来获取键列表。

相关内容