2019/11/20【全排列】

题目一:【全排列】力扣——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]

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值