服务器之家

服务器之家 > 正文

Java求字符串中出现次数最多的字符串以及出现次数

时间:2020-09-06 15:20     来源/作者:欧阳鹏

金山公司面试题:一个字符串中可能包含a~z中的多个字符,如有重复,如String data="aavzcadfdsfsdhshgWasdfasdf",求出现次数最多的那个字母及次数,如有多个重复的则都求出。

此题的解题思路如下:

引入TreeSet:通过集合快速找到所有出现过的字符串
引入ArrayList:为了快速排序,再通过StringBuffer生成排序后的字符串
通过String的indexOf方法和lastIndexOf方法来计算每个字符串出现的次数最大值
使用HashMap存储出现多的字符串和次数

代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.TreeSet;
 
public class SortTest {
  public static void main(String[] args) {
    String input = "httpblogcsdnnetouyangpeng";
    new SortTest().doString(input);
  }
 
  public void doString(String input) {
    /**
     * 第一步:
     *   使用TreeSet快速找到所有出现的字符串
     *   将输入的字符串按升序排列
     */
    //将String转换为字符数组
    char[] chars=input.toCharArray();
    ArrayList<String> lists=new ArrayList<String>();
    //TreeSet是一个有序集合,TreeSet中的元素将按照升序排列
    //通过TreeSet的不重复性,快速找到所有出现的字符串
    TreeSet<String> set=new TreeSet<String>();
    for (int i = 0; i < chars.length; i++) {
      lists.add(String.valueOf(chars[i]));
      set.add(String.valueOf(chars[i]));
    }
    //set= [a, b, c, d, e, g, h, l, n, o, p, s, t, u, y]
    System.out.println("set= "+set);  
    //排序
    Collections.sort(lists);
    //lists= [a, b, c, d, e, e, g, g, g, h, l, n, n, n, n, o, o, p, p, s, t, t, t, u, y]
    System.out.println("lists= "+lists);  
    //将排序好的字符数组转换为StringBuffer
    StringBuffer sb=new StringBuffer();
    for (int i = 0; i < lists.size(); i++) {
      sb.append(lists.get(i));
    }
    input=sb.toString(); 
    //input= abcdeeggghlnnnnooppstttuy
    System.out.println("input= "+input);  
     
    /**
     * 第二步: 找出出现相同的字符并记录出现多少次
     */
    //最多重复出现多少次
    int max=0;
    //重复出现的字符
    String maxString="";
    /*//重复出现的字符列表
    ArrayList<String> maxList=new ArrayList<String>();*/
    //用来保存出现最多的字符串和次数
    HashMap<String, Integer> hm=new HashMap<String, Integer>();
    //将出现过的字符遍历
    Iterator<String> its=set.iterator();
    while (its.hasNext()) {
      String os=its.next();
      //字符出现在排序后input中的第一次位置
      int begin=input.indexOf(os);
      //字符出现在排序后input中的最后一次位置
      int end=input.lastIndexOf(os);
      //字符出现的次数
      int value=end-begin+1;
      if (value>=max) {
        max=value;
        maxString=os;
        hm.put(maxString, max);
      }
    }
     
    for (Map.Entry<String, Integer> enties: hm.entrySet()) {
      if (enties.getValue()==max) {
        System.out.print("重复最多的字母是:"+enties.getKey());
        System.out.println("重复最多的次数是:"+enties.getValue());
      }
    }
  }
}

运行结果如下:

?
1
2
3
set= [a, b, c, d, e, g, h, l, n, o, p, s, t, u, y]
lists= [a, b, c, d, e, e, g, g, g, h, l, n, n, n, n, o, o, p, p, s, t, t, t, u, y]
input= abcdeeggghlnnnnooppstttuy

重复最多的字母是:n重复最多的次数是:4 

当有字符串重复的次数相同时,也可以将它们都打印出来。

?
1
2
3
4
public static void main(String[] args) {
  String input = "abbcccddddeeeeeffffffaaaaabbb";
  new SortTest().doString(input);
}

运行结果如下:

?
1
2
3
4
5
set= [a, b, c, d, e, f]
lists= [a, a, a, a, a, a, b, b, b, b, b, c, c, c, d, d, d, d, e, e, e, e, e, f, f, f, f, f, f]
input= aaaaaabbbbbcccddddeeeeeffffff
重复最多的字母是:f重复最多的次数是:6
重复最多的字母是:a重复最多的次数是:6

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:http://blog.csdn.net/ouyang_peng/article/details/46526519

标签:

相关文章

热门资讯

2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
Intellij idea2020永久破解,亲测可用!!!
Intellij idea2020永久破解,亲测可用!!! 2020-07-29
歪歪漫画vip账号共享2020_yy漫画免费账号密码共享
歪歪漫画vip账号共享2020_yy漫画免费账号密码共享 2020-04-07
最新idea2020注册码永久激活(激活到2100年)
最新idea2020注册码永久激活(激活到2100年) 2020-07-29
电视剧《琉璃》全集在线观看 琉璃美人煞1-59集免费观看地址
电视剧《琉璃》全集在线观看 琉璃美人煞1-59集免费观看地址 2020-08-12
返回顶部