摘要:給定一個(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"}; MapcountMap = 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然后排序,接著遍歷查找orderedChars和originalChars,操作比較麻煩,不推薦,但是可以鍛煉純數(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
摘要:要求編寫代碼實(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...
摘要:擴(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...
摘要:方法二生成統(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...
摘要:剛剛接觸一周的時(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...
摘要:剛剛接觸一周的時(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...
閱讀 1342·2023-04-26 00:10
閱讀 2437·2021-09-22 15:38
閱讀 3802·2021-09-22 15:13
閱讀 3518·2019-08-30 13:11
閱讀 655·2019-08-30 11:01
閱讀 3040·2019-08-29 14:20
閱讀 3220·2019-08-29 13:27
閱讀 1734·2019-08-29 11:33