网易笔试 最后一道题

今天下午网易笔试 最后一道:Java代码   用回溯法求出重复字符存在的所有排列,直接get 第K个就OK了,后知后觉。。。。。。。
public class Wangyi_String{

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int m = scanner.nextInt();
        long k = scanner.nextLong();
        String string = "";
        for (int i = 0; i < n; i++) {
            string += "a";
        }
        for (int i = 0; i < m; i++) {
            string += "z";
        }
        char[] arr = string.toCharArray();
        List<List<Character>> list = new ArrayList<>();
        boolean[] flag = new boolean[arr.length];
        backtrack(list, new ArrayList<>(), arr, flag);
//        for (List<Character> item : list) {
//            for (char c : item) {
//                System.out.print(c);
//            }
//            System.out.print(" ");
//        }
        for (char c : list.get((int) (k - 1))) {
            System.out.print(c);
        }
        
        
    }
    public static void backtrack(List<List<Character>> list, List<Character> temp, char[] arr, boolean[] flag) {
        if (temp.size() >= arr.length) {
            list.add(new ArrayList<>(temp));
            return;
        }
        for (int i = 0; i < arr.length; i++) {
            if (flag[i]) { // 已被访问过
                continue;
            }
            if (i > 0 && arr[i] == arr[i - 1] && !flag[i - 1]) {
                continue;
            }
            flag[i] = true;
            temp.add(arr[i]);
            backtrack(list, temp, arr, flag);
            flag[i] = false;
            temp.remove(temp.size() - 1);
        }
    }

}



#网易#
全部评论
回溯全排列,超时,过30%
点赞 回复 分享
发布于 2018-08-11 18:41
类名中文也是厉害啊
点赞 回复 分享
发布于 2018-08-11 18:42
全排列A不了吧?我只过了20
点赞 回复 分享
发布于 2018-08-11 18:41
我也是这么做,不行啊,复杂度高说是
点赞 回复 分享
发布于 2018-08-11 18:55
只能过30%
点赞 回复 分享
发布于 2018-08-11 19:07
全排列百分百过不了,我确定,最多30%
点赞 回复 分享
发布于 2018-08-11 19:18
计算选择a或者z是第几个数字就好
点赞 回复 分享
发布于 2018-08-11 19:29
唯一一个有思路的题,给我当头一棒
点赞 回复 分享
发布于 2018-08-12 09:26
动态规划做的,复杂度O(m*n) #include<iostream> #include<vector> using namespace std; //string s; void f(int x,int y,int k,vector<vector<int>> a,string s); int main() {     int x=10;     int y=12;     vector<vector<int>> a(y+1,vector<int>(x+1,0));     for(int i=0;i<=y;i++)         a[i][0]=1;     for(int i=0;i<=x;i++)         a[0][i]=1;     for(int i=1;i<=y;i++)         for(int j=1;j<=x;j++)             a[i][j]=a[i-1][j]+a[i][j-1];     for(int i=0;i<=y;i++)         {         cout<<i<<"行: ";             for(int j=0;j<=x;j++)             cout<<a[i][j]<<" ";         cout<<endl;         }     string s="";    f(x,y,111,a,s); return 0; } void f(int x,int y,int k,vector<vector<int>> a,string s) {     if(k>a[y][x]) {cout<<"too big K"<<endl;return;}     if(x==0||y==0)         {for(int i=0;i<x;i++)             s.push_back('a');         for(int i=0;i<y;i++)             s.push_back('z');         cout<<s<<endl;         return;         }     int nu=0;     for(int i=0;i<=x;i++)         if(nu+a[y-1][i]>=k)             {for(int j=0;j<x-i;j++)                 s.push_back('a');             s.push_back('z');             f(i,y-1,k-nu,a,s);break;             }         else nu+=a[y-1][i]; } don
点赞 回复 分享
发布于 2018-08-12 09:50

相关推荐

面试摇了我吧:啊哈哈面试提前五个小时发,点击不能参加就是放弃
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务