2013-10-25 161 views
2

我们给出了一个字符串,例如,取“TUOPPPPJHHTT” 我们希望找出哪个字符出现的次数最多,连续在字符串中出现多少次。 在这种情况下,其P发生4次。字符串中最重复的字符

我试图for循环运行如下

char[] array = S.toCharArray(); 
int count=1; 
for(int i =1; i < S.length(); i++) { 
    if(array[i] == array[i-1]) { 
     count++; 
    } 
} 

但在这种方法中,问题是,它会计算所有字母的重复出现。

+0

'“什么想法?”' - 其一,缩进和格式化你的代码更好,所以,它的可读性。对于另一种情况,请考虑使用26个项目的数组,每个字母一个,并在关联的插槽中设置最大连续计数。另一个选择是使用'HashMap '。 –

+0

想法:首先找出所有重复的人物序列,然后寻找你找到的最大的人物。 –

+0

你会把大小写成同一个字母吗? – KeepCalmAndCarryOn

回答

4

每次找到与前一个字符不同的字符时,表示运行(连续重复字母)结束,因此应记下当前运行的长度(即值为count),然后重置计数。最后你可以打印最大值。

char[] array = S.toCharArray() 
int count = 1; 
int max = 0; 
char maxChar = 0; 
for(int i=1; i<array.length; i++){ // Start from 1 since we want to compare it with the char in index 0 
    if(array[i]==array[i-1]){ 
     count++; 
    } else { 
     if(count>max){ // Record current run length, is it the maximum? 
      max=count; 
      maxChar=array[i-1]; 
     } 
     count = 1; // Reset the count 
    } 
} 
if(count>max){ 
    max=count; // This is to account for the last run 
    maxChar=array[array.length-1]; 
} 
System.out.println("Longest run: "+max+", for the character "+maxChar); // Print the maximum. 
0

试试这个,

 char[] array = input.toCharArray(); 
     Arrays.sort(array); 

     int max = 0; 
     int count = 1; 
     char temp = array[0]; 
     for (char value : array) 
     { 
      if (value == temp) 
      { 
       count++; 
      } 
      else 
      { 
       temp = value; 
       if (count > max) 
       { 
        max = count; 
       } 
       count = 1; 
      } 
     } 

     if(count > max) 
     { 
      max = count; 
     } 
    System.out.println("count : "+max); 
2

这里有一个更通用的解决方案,为所有文字作品;字母数字或特殊字符无关紧要。

private String findMaxChar(String str) { 
    char[] array = str.toCharArray(); 
    int maxCount = 1; 
    char maxChar = array[0]; 
    for(int i = 0, j = 0; i < str.length() - 1; i = j){ 
     int count = 1; 
     while (++j < str.length() && array[i] == array[j]) { 
      count++; 
     } 
     if (count > maxCount) { 
      maxCount = count; 
      maxChar = array[i]; 
     } 
    } 
    return (maxChar + " = " + maxCount); 
} 

System.out.println(findMaxChar("T")); 
System.out.println(findMaxChar("TDD")); 
System.out.println(findMaxChar("WWW")); 
System.out.println(findMaxChar("NOREPEATS")); 
System.out.println(findMaxChar("122333444455555")); 
System.out.println(findMaxChar("abc33++$$$_###*ABCC")); 

输出

T = 1 
D = 2 
W = 3 
N = 1 // First Character (if no repeats) 
5 = 5 
$ = 3 


如果你想打印有最大的事件的所有字符,请使用 Set收集它们为:

private static String findMaxChar(String str) { 
    char[] array = str.toCharArray(); 
    Set<Character> maxChars = new LinkedHashSet<Character>(); 

    int maxCount = 1; 
    maxChars.add(array[0]); 

    for(int i = 0, j = 0; i < str.length() - 1; i = j){ 
     int count = 1; 
     while (++j < str.length() && array[i] == array[j]) { 
      count++; 
     } 
     if (count > maxCount) { 
      maxCount = count; 
      maxChars.clear(); 
      maxChars.add(array[i]); 
     } else if (count == maxCount) { 
      maxChars.add(array[i]); 
     } 
    } 

    return (maxChars + " = " + maxCount); 
} 

输出

[T] = 1 
[D] = 2 
[W] = 3 
[N, O, R, E, P, A, T] = 1 
[5] = 5 
[$, #] = 3 // All Characters (in case of a tie) 
0

请试试这个代码我做到了,我.........

public static String getMaxRepeatedChar(String txt) { 
     if ((txt != null)) { 
      HashMap<Character, Integer> hash = new HashMap<Character, Integer>(); 
      char maxCh = 1; 
      int maxCnt = 0; 
      for (char ch : txt.toCharArray()) { 
       if (hash.containsKey(ch)) { 
        int i = hash.get(ch); 
        hash.put(ch, i + 1); 
        if (maxCnt < (i + 1)) { 
         maxCh = ch; 
         maxCnt = 1 + i; 
        } 

       } else { 
        hash.put(ch, 1); 
        if (maxCnt < 1) { 
         maxCh = ch; 
         maxCnt = 1; 
        } 
       } 

      } 
      return "Most Repeted character : " + maxCh + " and Count : " 
        + maxCnt; 
     } 

     return null; 
    } 
+0

它在单个循环中做出了答案........ –

1

您可以使用三元运算创建的简化版本@ justhalf的解决方案。另外,如果使用'charAt()'方法,则不需要先将字符串转换为字符数组。

int count = 1; 
int max  = 1; 
char maxChar = S.charAt(1); 

for(int i = 1; i < S.length(); i++) { 
    count = (S.charAt(i) == S.charAt(i - 1)) ? (count + 1) : 1; 
    if (count > max) { 
     max = count; 
     maxChar = S.charAt(i); 
    } 
} 

System.out.println("Longest run: "+max+", for the character "+maxChar); 

请注意,此代码假定S不是空的。

0
private static void findMaxChar(string S) 
{ 
    char[] array = S.ToLower().ToCharArray(); 
    int count = 1; 
    int max = 0; 
    char maxChar = '0'; 
    for (int i = 0; i < S.Length-1; i++) 
    { // Note that it should be S.length instead of S.length() 
     string stringleft=S.Replace(array[i].ToString(),""); 
     int countleft = S.Length - stringleft.Length; 
     count = countleft; 
     if (count > max) 
     { // Record current run length, is it the maximum? 
      max = count; 
      maxChar = array[i]; 
     } 
    } 

    // This is to account for the last run 
    Console.WriteLine("Longest run: "+max+", for the character "+maxChar); 
} 
+0

这只是代码的增强,可以在csharp中使用 –

-2
str = "AHSDFHLFHHSKSHDKDHDHHSJDKDKSDHHSDKKSDHHSDKLLDFLDFLDHAFLLLFFASHHHHHHYYYYYYYYYAAAAAAASDFJK" 
max = 1 
fin_max =1 
for i in range(0,len(str)-1): 
     if(str[i]==str[i+1]): 
      max = max + 1 
      if fin_max < max: 
       fin_max = max 
     else: 
      max = 1 
print fin_max 
0
import java.util.*; 

public class HighestOccurence { 

    public static void getHighestDupsOccurrancesInString(char[] arr) { 
     int count = -1; 
     int max = 0; 
     Character result = ' '; 
     // Key is the alphabet and value is count 
     HashMap<Character, Integer> hmap = new HashMap<Character, Integer>(); 

     for (int i = 0; i < arr.length; i++) { 
      if (hmap.containsKey(arr[i])) { 
       hmap.put(arr[i], hmap.get(arr[i]) + 1); 
      } else { 
       hmap.put(arr[i], 1); 
      } 
     } 
     for (Map.Entry<Character, Integer> itr : hmap.entrySet()) { 
      // System.out.println(itr.getKey() + " " + itr.getValue()); 
      if (Integer.parseInt(itr.getValue().toString()) > max) { 
       max = Integer.parseInt(itr.getValue().toString()); 
       if (hmap.containsValue(max)) { 
        result = itr.getKey(); 
       } 
      } 
     } 
     System.out.print("Maximum Occured Character is '" + result + "'"); 
     System.out.print(" with count :" + max); 

    } 

    public static void main(String args[]) { 

     Scanner scan = new Scanner(System.in); 
     System.out.println("Enter the String"); 
     String s = scan.nextLine(); 
     if (s.trim().isEmpty()) { 
      System.out.println("String is empty"); 
     } else { 
      char[] arr = s.toCharArray(); 
      getHighestDupsOccurrancesInString(arr); 
     } 

    } 

} 
+0

请不要添加代码。尝试添加一个解释。 –

0
public static int findMaximumRepeatedChar(String str){ 
     int count = 0, maxCount = 0, charAt = -1;       
     for(int i=0; i < str.length() - 1; i++){   
      if(str.charAt(i) != str.charAt(i+1)){ 
      if(count > maxCount){ 
       maxCount = count; 
       charAt = i - count + 1; 
      } 
      count = 0;    
     }else{ 
      count++; 
     }   
    }    
    if(charAt == -1) return -1; 
    else return charAt;  
} 
0

对于简单的字符串操作,这个程序是可以做到:

package abc; 
import java.io.*; 

public class highocc 
{ 
     public static void main(String args[])throws IOException 
     { 
      BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 
      System.out.println("Enter any word : "); 
      String str=in.readLine(); 
      str=str.toLowerCase(); 
      int g=0,count; 
      int ar[]=new int[26]; 
      char ch[]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'}; 
       for(int i=0;i<ch.length;i++) 
       { 
        count=0; 
        for(int j=0;j<str.length();j++) 
        { 
         char ch1=str.charAt(j); 
         if(ch[i]==ch1) 
          count++; 
        } 
        ar[i]=(int) count; 
       } 
       int max=ar[0]; 
       for(int j=1;j<26;j++) 
       { 
         if(max<ar[j]) 
         { 
          max=ar[j]; 
          g=j; 
         } 
         else 
         { 
          max=ar[0]; 
          g=0; 
         } 
       } 
       System.out.println("Maximum Occurence is "+max+" of character "+ch[g]); 
      } 
} 
-1
import java.util.*; 
    class findmax 
    { 
     public static void main(String args[]) 
      { 
       String s; 
       int max=0; 
       Scanner sc=new Scanner(System.in); 
       System.out.println("Enter String:"); 
       s=sc.next(); 
       String s1=" ";  
       for(int i=0;i<s.length();i++) 
       { 
        int count=0; 
         for(int j=i+1;j<s.length();j++){ 
          if(s.charAt(i)==s.charAt(j)) 
           count++; 
         } 
        if(count>max){ 
         s1=Character.toString(s.charAt(i)); 
         max=count; 
       } 
        else if(count==max) 
         s1=s1+" "+Character.toString(s.charAt(i)); 
       } 

       System.out.println(s1); 


      } 
    } 
0
public static char findMaximum(String input){ 
    int maxCount=0; 
    int count=1; 
    char result='\0'; 
    char[] temp=input.toCharArray(); 
    if(temp.length==1){ 
     return temp[0]; 
    } 
    for(int i=1;i<temp.length;i++){ 
     if(temp[i]==temp[i-1]){ 
      count++; 
     } 
     else{ 
      if(count>maxCount){ 
       maxCount=count; 
       result=temp[i-1]; 
      } 
      count=1; 
     } 
    } 
    return result; 

} 
+0

虽然这可能回答OP的问题,但最好的答案是也包含解释的答案。你能否记录你的代码中发生了什么? – Tgsmith61591

0

你可以试试这个代码:

import java.util.Scanner; 

public class HighestOccuringConsecutiveChar 
{ 

    public static char highestOccuringConsecutiveCharacter(String a) 
    { 
     int c= 0, cNext = 0; 
     char ans = '\0'; 
     for(int i = 0; i < a.length()-1; i++) 
     { 
      if(a.charAt(i) == a.charAt(i+1)) 
       cNext++; 

      if(cNext > c) 
      { 
       ans = a.charAt(i); 
       c = cNext; 
      } 
      if(a.charAt(i) != a.charAt(i)) 
       cNext = 0; 
     if(c == 0 && cNext == 0) 
      ans = a.charAt(i); 
     } 
     return ans; 
    } 

    public static void main(String[] args) 
    { 
     Scanner s = new Scanner(System.in);  
     String str = new String(); 
     str = s.nextLine();  
     System.out.println(highestOccuringConsecutiveCharacter(str)); 
    } 
} 
1
package naresh.java; 

import java.util.HashMap; 
import java.util.Map; 

public class StringPrg { 
    public static void main(String args[]){ 
    String str= "Ramrrnarmmmesh"; 
    //using hashmap to store unique character with integer count 
    Map<Character,Integer> map1 = new HashMap<Character,Integer>(); 

    for(int k=0; k < str.length(); k++) 
    { 
     char currentChar = str.charAt(k); 
     //to check that currentChar is not in map, if not will add 1 count for firsttime 
     if(map1.get(currentChar) == null){ 
     map1.put(currentChar, 1); 
     } 
     /*If it is repeating then simply we will increase the count of that key(character) by 1*/ 
     else { 
     map1.put(currentChar, map1.get(currentChar) + 1); 
     } 
    } 
    //Now To find the highest character repeated 
    int max=0; 
    char maxCharacter = 'a';//setting to a by default 
    for (Map.Entry<Character, Integer> entry : map1.entrySet()) 
    { 
     System.out.println("Key=" + entry.getKey() + ":Value" + entry.getValue()); 
     if(max<entry.getValue()){ 
      max=entry.getValue(); 
      maxCharacter=entry.getKey(); 
     } 
    } 
    System.out.println("Max Character=" + maxCharacter + "Max Count" + max); 
    } 
} 
+1

虽然这个答案确实有帮助,但通过解释你做了什么以及为什么,你可以大大提高答案的质量。 – Zabuza

+1

感谢您的宝贵意见,我在代码中添加了评论,我希望它会有所帮助,还有任何改进的余地,欢迎您的光临! –