成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

查找字符數(shù)組中出現(xiàn)次數(shù)最多的字符

plus2047 / 1421人閱讀

摘要:給定一個(gè)字符數(shù)組,例如找出數(shù)組中出現(xiàn)次數(shù)最多的字符,如果存在相同次數(shù)的字符,取出現(xiàn)較早者。

給定一個(gè)字符數(shù)組,例如char[] chars = { "a", "b", "b", "b", "b", "c", "a", "a", "a"};
找出數(shù)組中出現(xiàn)次數(shù)最多的字符,如果存在相同次數(shù)的字符,取出現(xiàn)較早者。
一個(gè)問題的解決方案有多種:

利用數(shù)據(jù)結(jié)構(gòu)的特性,鏈表保證了插入順序,Map正是我們想要的字符與出現(xiàn)次數(shù)對(duì)應(yīng)關(guān)系的映射,代碼如下,只需遍歷一次

    char[] chars = {"a", "b", "b", "b", "b", "c", "a", "a", "a"};
    Map countMap = new LinkedHashMap<>();
    Map indexMap = new LinkedHashMap<>();
    int length = chars.length;
    // 目標(biāo)字符
    char target = 0;
    // 出現(xiàn)的最多次數(shù)
    int maxCount = 0;
    for (int index = 0; index < length; index++) {
        char aChar = chars[index];
        Integer value = countMap.get(aChar);
        
        if (value == null) {
            // 如果已經(jīng)存在某字符 maxCount 比數(shù)組剩余待遍歷元素?cái)?shù)量還多,沒必要考慮它了
            if (maxCount > length - (index + 1)) {
                break;
            }
            countMap.put(aChar, 1);
            indexMap.put(aChar, index);
            
        } else {
            countMap.put(aChar, value += 1);
            
            if (maxCount == value) {
                // 出現(xiàn)相同次數(shù)的 char,取先在數(shù)組中出現(xiàn)的
                // 即誰出現(xiàn)的次數(shù) + 出現(xiàn)的 index 小
                // 也可以將 value 封裝成含有索引和次數(shù)的對(duì)象,那樣只需聲明一個(gè) map
                if (indexMap.get(aChar) < indexMap.get(target)) {
                    target = aChar;
                }
            } else if (maxCount < value) {
                maxCount = value;
                target = aChar;
            }
        }        
    }

將原數(shù)組拷貝成orderedChars然后排序,接著遍歷查找orderedCharsoriginalChars,操作比較麻煩,不推薦,但是可以鍛煉純數(shù)組操作和“指針”的使用

    char[] originalChars = {"a", "a", "c", "b", "b", "b", "c", "b", "c", "c", "a", "d", "d", "d"};
    int length = originalChars.length;
    // 拷貝原數(shù)組,并排序
    char[] orderedChars = new char[length];
    System.arraycopy(originalChars, 0, orderedChars, 0, length);
    Arrays.sort(orderedChars);
    // 最大次數(shù) 尋找的字符,給個(gè)默認(rèn)值
    int maxCount = 1;
    char target = orderedChars[0];
    int headIndex = 0, tailIndex = 1, targetIndex = -1;
    for (; tailIndex < length; ) {
        // 移動(dòng) tailIndex 的時(shí)候 headIndex 不動(dòng)
        // tailIndex++ == (length - 1) 特殊處理 orderedChars 最后幾位都是同一 char 的情況
        if (orderedChars[headIndex] != orderedChars[tailIndex] || (tailIndex++ == (length - 1))) {
            // 臨時(shí)計(jì)數(shù)器
            int tmpCount = tailIndex - headIndex;
            if (tmpCount < maxCount) {
                // 已找到出現(xiàn)次數(shù)最多的char 即 headIndex 的上一個(gè)
                target = orderedChars[headIndex - 1];
                break;
                
            } else if (tmpCount > maxCount) {
                maxCount = tmpCount;
                target = orderedChars[headIndex];

            } else {
                // 如果遇到相同次數(shù)的就比較麻煩了
                // 需要在原數(shù)組中比較誰先出現(xiàn),即索引更小者
                int tmpCurIndex = -1;
                for (int i = 0; i < length; i++) {
                    if (originalChars[i] == target && targetIndex == -1) {
                        targetIndex = i;
                    } else if (originalChars[i] == orderedChars[headIndex] && tmpCurIndex == -1) {
                        tmpCurIndex = i;
                    }
                    if (tmpCurIndex != -1 && targetIndex != -1) {
                        if (tmpCurIndex < targetIndex) {
                            targetIndex = tmpCurIndex;
                            target = originalChars[targetIndex];
                        }
                        break;
                    }
                }
            }

            // 在往后找的過程中,如果找到滿足條件的就將 headIndex 移至tailIndex,即 headIndex = tailIndex
            // tailIndex 繼續(xù)移動(dòng),即 ++ 操作
            headIndex = tailIndex;
        }
    }

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/74941.html

相關(guān)文章

  • 面試題:尋找一個(gè)字符出現(xiàn)次數(shù)多的字符以及出現(xiàn)次數(shù)

    摘要:要求編寫代碼實(shí)現(xiàn)尋找一個(gè)字符串中出現(xiàn)次數(shù)最多的字符以及出現(xiàn)的次數(shù)。最后只需要在集合中找到值最大的即可。 要求編寫代碼實(shí)現(xiàn):尋找一個(gè)字符串中出現(xiàn)次數(shù)最多的字符以及出現(xiàn)的次數(shù)。 解法一:用刪除法實(shí)現(xiàn) (挺巧妙的一種) public class FindTheMostAppearChar { public static void main(String[] args) { del...

    lei___ 評(píng)論0 收藏0
  • 找出數(shù)組出現(xiàn)次數(shù)多的一項(xiàng)并統(tǒng)計(jì)次數(shù)

    摘要:擴(kuò)展字符串中出現(xiàn)次數(shù)最對(duì)的字符是哪一項(xiàng)并統(tǒng)計(jì)實(shí)例方法可返回指定位置的字符。請(qǐng)注意,并沒有一種有別于字符串類型的字符數(shù)據(jù)類型,所以返回的字符是長(zhǎng)度為的字符串。語法注釋字符串中第一個(gè)字符的下標(biāo)是。如果參數(shù)不在與之間,該方法將返回一個(gè)空字符串。 實(shí)例1 var a,sum = 0; var obj = {}; var arr = [1,3,7,3,1,8,1,10,6,1]; for(va...

    eechen 評(píng)論0 收藏0
  • 三道關(guān)于字符串的JavaScript面試題解析

    摘要:方法二生成統(tǒng)計(jì)次數(shù)字符最多的是,出現(xiàn)了次點(diǎn)評(píng)稍微好一點(diǎn)。問題三題目如何給字符串加千分符例如方法一轉(zhuǎn)換的方法轉(zhuǎn)化為數(shù)組最終的結(jié)果點(diǎn)評(píng)將字符串轉(zhuǎn)化為數(shù)組,然后對(duì)其切分重組。 分享幾道js面試題,自己感覺還是挺重要的,當(dāng)看到題目的時(shí)候希望大家先花幾秒鐘考慮一下,然后在看答案。如果有比較好的解法,歡迎大家留言指正,謝謝大家! 第一題 題目: 寫一個(gè)字符串轉(zhuǎn)換成駝峰的方法? 例如:borde...

    Sourcelink 評(píng)論0 收藏0
  • JavaScript初應(yīng)用:找到數(shù)組出現(xiàn)多的字母并給出個(gè)數(shù)以及每一個(gè)所在的位置

    摘要:剛剛接觸一周的時(shí)間,熟悉了最基本的知識(shí),這是自己面對(duì)的第一個(gè)的邏輯性的代碼題目,自己嘗試了寫了,結(jié)果還算可以,因?yàn)橛泻枚嘀R(shí)涉及到了后面的知識(shí),就有點(diǎn)吃力了。以下代碼總結(jié)于網(wǎng)上前輩給出的參考答案和結(jié)合了自己的理解和注釋,請(qǐng)多多指正。 剛剛接觸JS一周的時(shí)間,熟悉了最基本的js知識(shí),這是自己面對(duì)的第一個(gè)js的邏輯性的代碼題目,自己嘗試了寫了,結(jié)果還算可以,因?yàn)橛泻枚嘀R(shí)涉及到了后面的do...

    Zhuxy 評(píng)論0 收藏0
  • JavaScript初應(yīng)用:找到數(shù)組出現(xiàn)多的字母并給出個(gè)數(shù)以及每一個(gè)所在的位置

    摘要:剛剛接觸一周的時(shí)間,熟悉了最基本的知識(shí),這是自己面對(duì)的第一個(gè)的邏輯性的代碼題目,自己嘗試了寫了,結(jié)果還算可以,因?yàn)橛泻枚嘀R(shí)涉及到了后面的知識(shí),就有點(diǎn)吃力了。以下代碼總結(jié)于網(wǎng)上前輩給出的參考答案和結(jié)合了自己的理解和注釋,請(qǐng)多多指正。 剛剛接觸JS一周的時(shí)間,熟悉了最基本的js知識(shí),這是自己面對(duì)的第一個(gè)js的邏輯性的代碼題目,自己嘗試了寫了,結(jié)果還算可以,因?yàn)橛泻枚嘀R(shí)涉及到了后面的do...

    darkerXi 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<