js--找字符串中出現最多的字符


在一個字符串中,如 'zhaochucichuzuiduodezifu',我們要找出出現最多的字符。本文章將詳細說明方法思路。

先介紹兩個string對象中的兩個方法:indexOf()charAt()方法

indexOf()方法介紹  返回某個指定的字符串值在字符串中首次出現的位置

語法 Object(string|array).indexOf(searchValue, fromIndex);
參數1  (必需)規定需檢索的字符串值
參數2 (可選)規定在字符串中開始檢索的位置(包括自身)。若省略,則從字符串的首字符開始檢索
注1 對大小寫敏感
注2 返回值是數字(索引),若檢索不到,返回-1

 

charAt()方法介紹  返回某個指定位置的字符

語法 stringObject.charAt(index);
參數index (必需)字符串中某個位置的數字,即字符在字符串中的下標
下標從0開始,若超出0-string.length之外,返回一個空的字符串


 先做一個小測試,找到字符串'woainixiaoli'中的每一個'i'出現的位置。

 1 <script>
 2     var arr = 'woainixiaoli';
 3     var index = -1;   //定義變量index控制索引值
 4     //當查找不到a,即indexOf()的值為-1時,結束循環
 5     do {
 6         index = arr.indexOf("i", index + 1);  //使用第二個參數index+1,控制每一次查找都是從上一次查找到字符a的下一個索引位置開始
 7         if (index != -1) {    //可以找到字符i
 8            console.log(index);   //輸出a的位置
 9         }
10     } while (index != -1);
11 </script>

以上代碼運行后再控制台輸出的是

 

 

進入正題,求字符串'zhaochucichuzuiduodezifu'最多的字符

方法一:用數組(存在缺點,當出現最多的字符不只一個時,只能找到一個)

 1 <script>
 2        var str = "zhaochucichuzuiduodezifu";
 3        var arr = [];//定義一個新數組
 4        //循環遍歷字符串
 5        for (var i = 0, length = str.length; i < length; i++) {
 6            var index = -1;
 7            var j = 0;
 8            //找每一個字符
 9            do {
10                index = str.indexOf(str[i], index + 1);
11                if (index != -1) {
12                    j++;
13                }
14            }while (index != -1);
15            arr[j] = str[i];    //把字符串str中的字符賦給數組arr索引為j的數據,當多次循環后,會出現重復賦值的現象,
                    //后賦值的會把之前的賦值覆蓋掉,但不影響我們找出字符出現最多的那個
16 } 17 console.log(arr); 18 console.log("最多的字符是" + arr[arr.length - 1]); 19 console.log("次數是" + (arr.length - 1)); 20 </script>

以上代碼運行后再控制台輸出的結果如下圖:

  從輸出的數組arr中也可以看出,此方法會把次數相同的字符覆蓋,只能顯示出一個。若有2個字符出現出現相同的最高次數,此方法只能得出一個。基於此,參照下一個用對象來解決的方法。

 

 

方法二:用對象(推薦使用)

<script>
    var str = "zhaochucichuzuiduodezifu";
    var o = {};
    for (var i = 0, length = str.length; i < length; i++) {
//        var char = str[i];
        var char = str.charAt(i);
        if (o[char]) {  //char就是對象o的一個屬性,o[char]是屬性值,o[char]控制出現的次數
            o[char]++;  //次數加1
        } else {
            o[char] = 1;    //若第一次出現,次數記為1
        }
    }
    console.log(o);   //輸出的是完整的對象,記錄着每一個字符及其出現的次數
    //遍歷對象,找到出現次數最多的字符和次數
    var max = 0;
    var maxChar = null;
    for (var key in o) {
        if (max < o[key]) {
            max = o[key];   //max始終儲存次數最大的那個
            maxChar = key;  //那么對應的字符就是當前的key
        }
    }
    console.log("最多的字符是" + maxChar);
    console.log("出現的次數是" + max);
</script>

以上代碼運行后再控制台輸出的結果如下圖:

  此方法解決了方法一的問題,而且每一個字符我們都可以清楚的記錄出現的次數,當有兩個次數相同的字符時,可以在對象中清楚的看到。

  不過還是存在不足,不能直接把次數最高的字符同時輸出,這還需要加額外的判斷條件。完美的代碼如下哈O(∩_∩)O

 1 <script>
 2     var str = "nininihaoa";
 3     var o = {};
 4     for (var i = 0, length = str.length; i < length; i++) {
 5         var char = str.charAt(i);
 6         if (o[char]) {
 7             o[char]++;  //次數加1
 8         } else {
 9             o[char] = 1;    //若第一次出現,次數記為1
10         }
11     }
12     console.log(o);   //輸出的是完整的對象,記錄着每一個字符及其出現的次數
13     //遍歷對象,找到出現次數最多的字符的次數
14     var max = 0;
15     for (var key in o) {
16         if (max < o[key]) {
17             max = o[key];   //max始終儲存次數最大的那個
18         }
19     }
20     for (var key in o) {
21         if (o[key] == max) {
22             //console.log(key);
23             console.log("最多的字符是" + key);
24             console.log("出現的次數是" + max);
25         }
26     }  
27 </script>

 結果如下:

 


免責聲明!

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



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