leetcode做题总结,题目Permutation Sequence 2012/03/27

题目是Permutation Sequence 这道题其实和前面的很多题都是类似,一开始我的想法是要用回溯法把字符串全部生成然后取第K个,其实这样很明显会超时,尤其是在遇到查找第K个的时候一般都是不用全部生成的,直接生成对应的字符串即可。这个题目很好找规律,然后从高位到低位依次生成即可。但是我一开始是用boolean数组判断重复,boonlean数组在判断重复上很有用,但是这道题boolean数组不是最好的选择,因为要不断的从剩余的元素中从前往后历遍,这时使用ArrayList是更好地选择,因为用过的数字从中删掉即可!这样历遍非常方便。

下面提一下StringBuilder, 这个主要是对字符串的连接,比直接对String的操作速度快,添加的方法为append,删除为deleteCharAt(i) 具体的使用将来再做一总结。


public class Solution {
    private int getmuti(int n){
        int res=1;
        for(int i=1;i<=n;i++){
            res=res*i;
        }
        return res;
    }
    
    public String getPermutation(int n, int k) {
        boolean[] sa = new boolean[n+1];
        String res = "";
        LinkedList<String> l = new LinkedList<String>();
        for(int i=1;i<=n;i++){
            l.add(""+i);
        }
        if(n==0)
            return res;
        if(n==1)
            return "1";
        for(int i=n;i>1;i--){
            int tmp = getmuti(i-1);
            int shang = k/tmp;
            int yu = k%tmp;
            if(k==0)
                shang=l.size();
            if(yu==0)
                shang--;
            String shu = l.get(shang);
            l.remove(shang);
            res+=shu;
            
            k=yu;
        }
        String shu = l.get(0);
        //l.remove(shang);
        res+=shu;
        return res;
    }
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值