2041_22T2.Q4

因为提到了作为头和尾的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"