题目一:【电话号码的字母组合】力扣——17
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例:
输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
#!/bin/bash
#电话号码的字母组合
#author:yzt 2019-10-26
#
echo "1" >tmp.txt #使用1来初始化文档
longstr="" #定义一个空变量
A2=(a b c) #使用数组来存储字符
A3=(d e f)
A4=(g h i)
A5=(j k l)
A6=(m n o)
A7=(p q r s)
A8=(t u v)
A9=(w x y z)
digui(){ #使用递归函数
str=$1
num=`echo "$str"|cut -b 1` #每次截取变量$str的第一个字符
case $num in #由于有2-9种情况,使用case语句
2)
for i in `cat tmp.txt` #使用文档中每一行与该数组的元素组合新的字符串并输出到临时文档中
do
for j in ${A2[@]}
do
echo $i$j
done
done >tmp2.txt
cat tmp2.txt > tmp.txt;; #将临时文档的内容覆盖tmp.txt文档
3)
for i in `cat tmp.txt`
do
for j in ${A3[@]}
do
echo $i$j
done
done >tmp2.txt
cat tmp2.txt > tmp.txt;;
4)
for i in `cat tmp.txt`
do
for j in ${A4[@]}
do
echo $i$j
done
done >tmp2.txt
cat tmp2.txt > tmp.txt;;
5)
for i in `cat tmp.txt`
do
for j in ${A5[@]}
do
echo $i$j
done
done >tmp2.txt
cat tmp2.txt > tmp.txt;;
6)
for i in `cat tmp.txt`
do
for j in ${A6[@]}
do
echo $i$j
done
done >tmp2.txt
cat tmp2.txt > tmp.txt;;
7)
for i in `cat tmp.txt`
do
for j in ${A7[@]}
do
echo $i$j
done
done >tmp2.txt
cat tmp2.txt > tmp.txt;;
8)
for i in `cat tmp.txt`
do
for j in ${A8[@]}
do
echo $i$j
done
done >tmp2.txt
cat tmp2.txt > tmp.txt;;
9)
for i in `cat tmp.txt`
do
for j in ${A9[@]}
do
echo $i$j
done
done >tmp2.txt
cat tmp2.txt > tmp.txt;;
*)
echo "输入的数字有误!请输入2-9之间的数字"
exit 1;;
esac
str=`echo ${str:1}` #去除变量$str左边第一个字符
if [ -z $str ];then #判断变量$str是否为空
cat tmp.txt|sed 's#^1##' >result.txt #将文档tmp.txt中所有的1都去除
for jj in `cat result.txt`
do
longstr=$longstr$jj, #将文档tmp.txt的每一行累加到一个变量中
done
llongstr=`echo "$longstr"|sed 's#,$##'` #去掉变量$longstr字符串中的","
echo "[$llongstr]"
exit 0
else
digui $str #此处是递归函数的核心,意思是如果变量$str不为空,则继续对此字符串进行处理,操作同上
fi
}
digui $1
脚本逻辑:
1、使用数组来存储每个数字所表示的字符
2、使用cut命令来逐个截取字符,然后使用for循环组合字符串
效果展示:
[root@localhost leetcode]# ./dianhuahaomadezimuzuhe.sh 234
[adg,adh,adi,aeg,aeh,aei,afg,afh,afi,bdg,bdh,bdi,beg,beh,bei,bfg,bfh,bfi,cdg,cdh,cdi,ceg,ceh,cei,cfg,cfh,cfi]
[root@localhost leetcode]# ./dianhuahaomadezimuzuhe.sh 23
[ad,ae,af,bd,be,bf,cd,ce,cf]
题目二:【四数之和】力扣——18
给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。
注意:
答案中不可以包含重复的四元组。
示例:
给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。
满足要求的四元组集合为:
[
[-1, 0, 0, 1],
[-2, -1, 1, 2],
[-2, 0, 0, 2]
]
#!/bin/bash
#四数之和
#author:yzt 2019-10-25
#
read -t 40 -p "请输入给定数组:" nums
echo "$nums"|sed 's#\[\|\]##g'|sed 's#,#\n#g' >tmp1.txt #将每个数字放到文档的一行中存储
declare -i aa=1
cat /dev/null >result.txt #初始化一个空文档
for i in `cat tmp1.txt`
do
bb=2
aa=$[$aa+1]
sed -n "$aa,$ p" tmp1.txt>tmp2.txt #这种多次循环,需要自己理解里面的逻辑
hangshu=`cat tmp2.txt|wc -l`
test $hangshu -lt 3 && break
for j in `cat tmp2.txt`
do
cc=2
cat tmp2.txt|sed -n "$bb,$ p" >tmp3.txt
test -s tmp3.txt||break
bb=$[$bb+1]
for k in `cat tmp3.txt`
do
cat tmp3.txt|sed -n "$cc,$ p" >tmp4.txt
test -s tmp4.txt||break
for l in `cat tmp4.txt`
do
sum=$[$i+$j+$k+$l]
if [ $sum -eq 0 ];then
echo "[$i,$j,$k,$l]">>result.txt
fi
done
cc=$[$cc+1]
done
done
done
cat result.txt
脚本逻辑:
1、对提供的数字以每次取四个的方式进行不重复遍历
2、难点在于数字的截取,以及如何取消已遍历的数字
3、多重for循环嵌套使用
效果展示:
[root@localhost leetcode]# ./sishuzhihe.sh
请输入给定数组:[-1,2,0,1,0,4,-3]
[-1,0,1,0]
[-1,0,4,-3]
[-1,0,4,-3]
[2,0,1,-3]
[2,1,0,-3]
[root@localhost leetcode]# ./sishuzhihe.sh
请输入给定数组:[1,0,-1,0,-2,2]
[1,0,-1,0]
[1,-1,-2,2]
[0,0,-2,2]