現有‘abcdefghijkl’12個字符,將其所有的排列按字典序進行排序,給出任意一組排列,說出這租排列在所有排列中是第幾小的


題目:

  現有‘abcdefghijkl’12個字符,將其所有的排列按字典序進行排序,給出任意一組排列,說出這租排列在所有排列中是第幾小的

 

  據說這道題是百度校招的一道算法題,反正我覺得我在學校的時候很可能做不出來。在學校的時候真該好好學習啊,我也逃不過畢業之后再來后悔的命運。但是,我還是要說點正能量的話,

只要知道學,什么時候都不晚。至少現在我做這道題的時候沒遇到太大的困難,說明畢業之后的學習還是有很大作用的。為了我喜歡的編程,為了我喜歡的算法,繼續努力!

  言歸正傳,我看到這道題的時候,原文有這道題的解法和思路,但是原諒我是學渣,看不懂那些數學公式

  

  我的思路是,假如,給出的第一位是b(給出的這個字符串簡稱str),那么所有以a開頭的字符串都會排在str前面。

  以a開頭的字符串的數量是多少呢?就是后面11位字符所有的排列組合,也就是11的階乘。

  如果第一位是c,那么所有以a或者b開頭的所有字符串就會排在str的前面,也就是 2*11! (注意后面是11的階乘,不是11),依次類推,可以知道第一位是任意字符時排在str前面的字符串的數量

  接着看第二位,第二位的思路和第一位一樣,同樣可以知道第二位是任意字符時排在str前面的字符串的數量,以此類推,后面的字符都算完之后,把全部結果相加

  但是,這個時候還有一個問題,在這道題中12個字符是固定的,所以假如第一位不是a,是b,那么a在后面的字符中一定會出現,同時b也不會再出現,所以在進行上面的計算時,不能直接以字典序來進行計算,在計算每一位時要根據尚未出現過得字符的順序,來排列未出現的字符的順序,具體看代碼里的注釋,不明白的地方debug一步一步看。

 

/**
     * 現有‘abcdefghijkl’12個字符,將其所有的排列按字典序進行排序,給出任意一組排列,說出這租排列在所有排列中是第幾小的
     * System.out.println(getSortNum("abcdefghijlk")); //1
     * System.out.println(getSortNum("hgebkflacdji")); //302715242
     * System.out.println(getSortNum("gfkedhjblcia")); //260726926
     */
    public static int getSortNum(String value) {
        // 記錄已經出現過得字符和未出現的字符順序
        String sort = "abcdefghijkl";
        
        // 記錄結果數
        int res = 1;
        for(int i=0;i<value.length();i++) {
            // 依次取各位的字符
            char c = value.charAt(i);
            // 查看該字符在所有字符中的當前順序
            int head = sort.lastIndexOf(c);
            // 計算排在前面的字符串數量
            res += ((head-i)*factorial(11-i));
            
            // 修改字符順序,將當前出現的字符,交換到字符最前面
            // 因為我們不關心已經出現過得字符的順序,我們只要知道出現過哪些字符以及未出現的字符的字典序
            // 所以直接把出現過得字符扔到最前面就可以了
            sort = change(sort, head);
        }
        return res;
    }
    
    /**
     * 求階乘
     * @param i
     * @return
     */
    public static int factorial(int i) {
        if(i==0) return 0;
        int result = 1;
        for(;i>1;i--) {
            result *= i;
        }
        return result;
    }

        /**
     * 將字符串第a位換到最前面
     * @param str
     * @param a
     * @param b
     * @return
     */
    public static String change(String str,int a) {
        char[] chars = str.toCharArray();
        char temp = chars[a];
        for(int i=a;i>0;i--) {
            chars[i] = chars[i-1];
        }
        chars[0] = temp;
        return String.valueOf(chars);
    }    

  可能我說的不是很清楚,我是新手,多諒解諒解,可以看代碼,有什么不對的地方歡迎指出

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM