Bir tamsayı dizisi verildiğinde, iki sayının dizinini belirli bir hedefe ekleyebilecekleri şekilde döndür


0

Bir tamsayı dizisi verildiğinde, iki sayının dizinini belirli bir hedefe eklenecek şekilde döndürür.

Her girişin tek bir çözüme sahip olacağını varsayabilir ve aynı öğeyi iki kez kullanmayabilirsiniz.

Örnek: Verilen numaralar = [2, 7, 11, 15], hedef = 9,

Çünkü nums [0] + num [1] = 2 + 7 = 9, [0, 1] döndür.

Bunu bash olarak denemekle birlikte, benimki sözdizimi hatalarıyla başarısız oluyor, lütfen mantığın doğru olup olmadığını ve sözdizimi hataları varsa lütfen bana bildirin:

#!/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

Yanıtlar:


2

Kişisel ifihtiyaçlar karşılık gelen thenve gerektiği 1 kullanım (( . . .))aritmetik test için, yani

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

veya o zamandan beri

Bir ifadede, kabuk değişkenlerine parametre genişletme sözdizimini kullanmadan ada göre de başvuruda bulunabilir.

basitleştirebilirsin

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

SHELL GRAMMAR - Compound CommandsAlt bölümüne bakın man bash.


  1. Sen eski bir aritmetik değerlendirme sözdizimi görebilirsiniz $[ . . . ]yapma,

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

    Ayrıca yasal - ancak bu onaylanmamıştır ve yeni komut dosyalarında kullanılmamalıdır.


0

for i in "${array[@]}"ilişkisel dizinin değerleri üzerinde dolaşıyor. Anahtarların üzerinden geçmek istiyorum, for in "${!array[@]}"içinde bash. Yani:

#! /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"

Argüman olarak iletilen giriş numarasının aksi belirtildiği gibi doğrulanmasının önemli olduğunu unutmayın, kod isteğe bağlı bir komut yürütme güvenlik açığı oluşturacaktır.

Ayrıca bash, önde gelen sıfırları olan sayıları sekizli sayılar olarak anladığına dikkat edin , bu nedenle 010, 10 değil 8 olarak anlaşılır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.