我已經撰寫了一個程式,可以找到最頻繁(最左邊)和最右邊的第二頻繁字符,但我不知道如何讓第二最頻繁的方法堅持出現的第一個字符左邊。
這是我需要該方法執行的操作:
secondMostFrequent("abcdbcd") = ’c’
secondMostFrequent("abbcdbcd") = ’c’?
而我的方法是這樣做的:
secondMostFrequent("abcdbcd") = ’d’?
mostFrequent("abcdbcd") = ’b’?
這是代碼:
public static Character mostFrequent(String s) {
String sHold = s;
Character[] arrayHold = toCharacterArray(sHold); //toCharacterArray() converts the string into an array of characters
char element = ' ';
int count = 0;
for(int i = 0; i < arrayHold.length; i ){
char tempElement = arrayHold[i];
int tempCount = 0;
for(int j = 0; j < arrayHold.length; j ){
if(arrayHold[j] == tempElement){
tempCount ;
if(tempCount > count) {
element = tempElement;
count = tempCount;
}
}
}
}
return element;
}
public static Character[] toCharacterArray(String s ) { //serves to convert a string into an array of characters
if (s == null) {
return null;
}
int len = s.length();
Character[] array = new Character[len];
for (int i = 0; i < len ; i ) {
array[i] = s.charAt(i);
}
return array;
}
public static Character secondMostFrequent(String s){
String sHold = s;
Character[] arrayHold = toCharacterArray(sHold);
char element = ' ';
char element2 = ' ';
int count = 0;
int count2 = 0;
for(int i = 0; i < arrayHold.length; i ){
char tempElement = arrayHold[i];
char tempElement2 = arrayHold[i];
int tempCount = 0;
int tempCount2 = 0;
for(int j = 0; j < arrayHold.length; j ){
if(arrayHold[j] == tempElement){
tempCount ;
if(tempCount > count) {
element = tempElement;
count = tempCount;
}
else{
element2 = tempElement2;
count2 = tempCount2;
}
}
}
}
return element2;
}
public static void main (String[]args){
System.out.println("The most common character is: " "'" mostFrequent("abcdbcd") "'");
System.out.println("The second most common character is: " "'" secondMostFrequent("abcdbcd") "'");
}
}
uj5u.com熱心網友回復:
如果你有一個回傳最常見字符的函式,你可以使用它來創建一個函式,通過洗掉最常見的字符來回傳第二個最常見的字符:
public static Character secondMostFrequent(String source) {
return mostFrequent(source.replaceAll(Character.toString(mostFrequent(source)), ""));
}
或者,如果您有一個作業函式從右到左回傳第二個最常見的字符,并且您希望它從左到右,請在呼叫該函式之前反轉字串。
誠然,這些都是“快速修復”來實作它。但有時,這就是你所需要的。
uj5u.com熱心網友回復:
這就是您的任務的解決方案。
時間復雜度:O(n)
它對給定的字串進行兩次迭代:
- 首先 - 為每個字符創建頻率直方圖 - Map<Character, Integer> hist;
- second - 根據直方圖查找出現頻率最高的兩個字符。
public static Character secondMostFrequent(String source) {
Map<Character, Integer> hist = getHistogram(source);
char firstChar = 0;
char secondChar = 0;
int firstCount = 0;
int secondCount = 0;
for (int i = 0; i < source.length(); i ) {
char next = source.charAt(i);
if (firstCount == 0 || hist.get(next) > firstCount) {
secondChar = firstChar;
secondCount = firstCount;
firstChar = next;
firstCount = hist.get(next);
}
else if (next != firstChar &&
(secondCount == 0 || hist.get(next) > secondCount)) {
secondChar = next;
secondCount = hist.get(next);
}
}
return secondChar;
}
private static Map<Character, Integer> getHistogram(String source) {
Map<Character, Integer> hist = new HashMap<>();
for (int i = 0; i < source.length(); i ) {
hist.merge(source.charAt(i), 1, Integer::sum);
}
return hist;
}
輸出
對于這些電話:
System.out.println(secondMostFrequent("abcdbcd"));
System.out.println(secondMostFrequent("abbcdbcd"));
System.out.println(secondMostFrequent("abcccdeeeaaa"));
c
c
e
uj5u.com熱心網友回復:
您應該使用PriorityQueue找出nth最常見的字符。請記住,每次將新元素插入優先級佇列時,佇列中所有存在的元素都會根據給定的比較器進行排序。
public static char findMostFrequent(String str, int num) {
class Pair {
final char ch;
int count;
public Pair(char ch) {
this.ch = ch;
}
}
Map<Character, Pair> map = new HashMap<>();
for (int i = 0; i < str.length(); i )
map.computeIfAbsent(str.charAt(i), Pair::new).count ;
final Comparator<Pair> sortByCountAsc = Comparator.comparingInt(one -> one.count);
final Comparator<Pair> sortByCharacterAsciiAsc = Comparator.comparingInt(one -> one.ch);
final Comparator<Pair> sortByMostCommonDesc = sortByCountAsc.reversed().thenComparing(sortByCharacterAsciiAsc);
Queue<Pair> queue = new PriorityQueue<>(sortByMostCommonDesc);
queue.addAll(map.values());
int i = 1;
while (!queue.isEmpty()) {
Pair pair = queue.remove();
if (i == num)
return pair.ch;
}
return '\0';
}
演示:
public static void main(String[] args) {
System.out.println(findMostFrequent("abbcdbcd", 1)); // b
System.out.println(findMostFrequent("abcdbcd", 2)); // c
System.out.println(findMostFrequent("abbcdbcd", 2)); // c
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/419142.html
標籤:
上一篇:為什么這個解決方案是錯誤的?
