2019/10/26【电话号码的字母组合】&【四数之和】

题目一:【电话号码的字母组合】力扣——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]

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值