题目一:【全排列】力扣——46
给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
shell脚本展示:
#!/bin/bash
#全排列
#author:yzt 2019-11-20
#
read -t 40 -p "请输入一个无重复数字的序列:" xulie
contents=`echo "$xulie" |sed 's#\[\|\]##g'|sed 's#,# #g'`
num=`echo "$contents" |wc -w`
echo "0">tmp.txt
for((i=1;i<="$num";i++))
do
cat /dev/null >tmp1.txt
for j in `cat tmp.txt`
do
for k in $contents
do
echo "$j$k" >>tmp1.txt
done
done
cat tmp1.txt|sort |uniq >tmp.txt
done
cat tmp.txt|sed 's#^0##'>result.txt
cat /dev/null >result1.txt
for bb in `cat result.txt`
do
flag="t_t"
for item in $contents
do
echo "$bb"|grep "$item" &>/dev/null ||flag="f_f"
done
if [ $flag = 't_t' ];then
echo "$bb" >>result1.txt
fi
done
while read line
do
echo "$line"|sed 's#[.]*# #g'|sed 's#^ ##'|sed 's# $##'|sed 's#^#[#'|sed 's#$#]#'|sed 's# #,#g'
done <result1.txt
脚本逻辑:
第一步:使用一个例子说明吧:比如目标数组为[1,2,3],先假设有一个文档,且只有一个"0"元素,由于目标数组中有三个元素,那么进行三次如下循环:第一次将文档中的"0"元素分别与数组中每个元素进行拼接,得到01,02,03,然后将结果覆盖文档的内容;第二次循环,使用文档中每个元素与目标数组元素进行拼接,以01元素为例得到:011,012,013;02元素得到021,022,023等,然后将新的结果覆盖文档内容进行第三次循环;以012为例得到:0121,0122,0123,将所得结果覆盖文档内容。
第二步:将文档中每个元素中的首字符"0"去掉,然后对每个元素使用grep命令进行目标数组元素检索,若其中一个元素没有检索到,则此项非目标项,比如0121中,去掉首字符"0"后,得到121,当121使用grep 匹配目标数组"3"时会为空,所以121不是目标项
以上是此脚本处理的主要逻辑,过程的语法有多种实现
效果展示:
[root@localhost leetcode]# ./quanpailie.sh
请输入一个无重复数字的序列:[4,5]
[4,5]
[5,4]
[root@localhost leetcode]# ./quanpailie.sh
请输入一个无重复数字的序列:[3,4,5]
[3,4,5]
[3,5,4]
[4,3,5]
[4,5,3]
[5,3,4]
[5,4,3]
[root@localhost leetcode]# ./quanpailie.sh
请输入一个无重复数字的序列:[2,4,5,8]
[2,4,5,8]
[2,4,8,5]
[2,5,4,8]
[2,5,8,4]
[2,8,4,5]
[2,8,5,4]
[4,2,5,8]
[4,2,8,5]
[4,5,2,8]
[4,5,8,2]
[4,8,2,5]
[4,8,5,2]
[5,2,4,8]
[5,2,8,4]
[5,4,2,8]
[5,4,8,2]
[5,8,2,4]
[5,8,4,2]
[8,2,4,5]
[8,2,5,4]
[8,4,2,5]
[8,4,5,2]
[8,5,2,4]
[8,5,4,2]