因为提到了作为头和尾的nm都是不会变的,所以有两种办法。
第一种是用等差数列求和公式,期望的从n到m之和对比目前实际和和之差就是缺省的数。
第二种方法是排序之后从最小的数遍历,如果当前数和期望的数不一致,那么就输出期望的数,然后期望的数加一,继续遍历,如果一致,就期望的数加一,继续遍历。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| #!/bin/dash
sorted=$(sort -n "$1")
prev=""
for curr in $sorted;do if [ -n "$prev" ]; then if [ "$curr" -ne $((prev + 1)) ]; then echo $((prev + 1)) break fi fi prev="$curr" done
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| #!/bin/sh
# 1. 获取极值 min=$(sort -n "$1" | head -n 1) max=$(sort -n "$1" | tail -n 1)
# 2. 初始化累加器 actual_sum=0
# 3. for 循环累加 # $(cat "$1") 会将文件内容全部读出,Shell 会根据默认的 IFS(包含换行符)将其切分为列表 for num in $(cat "$1"); do actual_sum=$((actual_sum + num)) done
# 4. 计算理论总和 expected_sum=$(( (min + max) * (max - min + 1) / 2 ))
# 5. 计算并输出差值 diff=$(( expected_sum - actual_sum ))
[ "$diff" -gt 0 ] && echo "$diff"
|