在一個字符串中,如 '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>
結果如下: