Dado um array de inteiros, retorne índices dos dois números de forma que eles se somem a um alvo específico

0

Dado um array de números inteiros, retorne os índices dos dois números de forma que eles se somem a um alvo específico.

Você pode assumir que cada entrada teria exatamente uma solução e você não pode usar o mesmo elemento duas vezes.

Exemplo: Dado nums = [2, 7, 11, 15], target = 9,

Porque nums [0] + nums [1] = 2 + 7 = 9, return [0, 1].

Tentando isso no bash, mas o meu falha com erros de sintaxe, por favor, deixe-me saber se a lógica está correta e se há algum erro de sintaxe:

#!/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
    
por arfat619 13.08.2017 / 23:25

2 respostas

2

Seu if precisa de um then correspondente e você deve 1 usar (( . . .)) para o teste aritmético, ou seja,

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

ou desde

Within an expression, shell variables may also be referenced by name without using the parameter expansion syntax.

você pode simplificar isso para

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

Veja a subseção SHELL GRAMMAR - Compound Commands de man bash .

  1. Você pode ver uma sintaxe de avaliação aritmética mais antiga $[ . . . ] , tornando

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

    também é legal - mas isso está obsoleto e não deve ser usado em novos scripts.

por 14.08.2017 / 00:06
0

for i in "${array[@]}" faz um loop sobre os valores da matriz associativa. Eu quero fazer um loop sobre as chaves, é for in "${!array[@]}" in bash . Então:

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

if [[ ! $T =~ ^-?[0-9]+$ ]]; 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]}"
      ret=0
      break 2
    fi
  done
done
exit "$ret"

Note que é importante validar o número de entrada passado como argumento, caso contrário, o código introduziria uma vulnerabilidade arbitrária de execução de comandos.

Observe também que bash entende números com zeros à esquerda como números octal , então 010 seria entendido como 8, não 10.

    
por 14.08.2017 / 09:27