数学求解之求出现次数最多的字母和次数

本文介绍了一种使用Java编程语言找出给定字符串中出现频率最高的字符的方法,并通过优化算法提高了查找效率。

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

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.TreeSet;

public class FindRepeatChar {
	
	public static void doString(String strInput) {
		char[] chars = strInput.toCharArray();
		ArrayList lists = new ArrayList();
		TreeSet set = new TreeSet();
		for (int i = 0; i < chars.length; i++) {
			lists.add(String.valueOf(chars[i]));
			set.add(String.valueOf(chars[i]));
		}
		System.out.println(set);
		Collections.sort(lists);
		System.out.println(lists);
		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < lists.size(); i++) {
			sb.append(lists.get(i));
		}
		strInput = sb.toString();
		System.out.println(strInput);
		int max = 0;
		String maxString = "";
		ArrayList maxList = new ArrayList();
		for (Iterator its = set.iterator(); its.hasNext();) {
			String os = (String) its.next();
			int begin = strInput.indexOf(os);
			int end = strInput.lastIndexOf(os);
			int value = end - begin + 1;
			if (value > max && value > 1) {
				max = value;
				maxString = os;
				maxList.add(os);
			} else if (value == max) {
				maxList.add(os);
			}
		}
		System.out.println("出现最多的字符为:");
		for (int i = 0; i < maxList.size(); i++) {
			System.out.println(maxList.get(i) + "");
		}
		System.out.println("出现最多的次数为:" + max);
	}

	public static void main(String[] args) {
		String strInput = new String("aavzcadfdsfsdhshgWasdfasdf");
		doString(strInput);
	}
}


上面的算法有问题:

下面是修改以后的:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.TreeSet;

public class FindRepeatChar {

    public static void doString(String strInput) {
        char[] chars = strInput.toCharArray();
        //去掉重复的字符串
        TreeSet set = new TreeSet();
        for (int i = 0; i < chars.length; i++) {     
            set.add(String.valueOf(chars[i]));
        }
        System.out.println(set);
        System.out.println(strInput); 
         int max = 0;
         //获取每种字符串出现的次数,并求出最大的出现次数
        HashMap<String,Integer> maps=new HashMap<String,Integer>();      
        for (Iterator its = set.iterator(); its.hasNext();) {
            String os = (String) its.next();
            int value=countToken(strInput,os);
            if(value>max)
            {
                max=value;
            }
            maps.put(os, value);           
        }
       
        //把出现次数最大的放入List中
        List maxList=new ArrayList();
        
        for(Map.Entry<String,Integer> entry:maps.entrySet())
        {
            String key=entry.getKey();
            Integer val=entry.getValue();
            if(val==max )
            {
                maxList.add(key);
            }
            
        }
        System.out.println("出现最多的字符为:");
        for (int i = 0; i < maxList.size(); i++) {
            System.out.println(maxList.get(i) + "");
        }
        System.out.println("出现最多的次数为:" + max);
    }

    //获取出现次数
    public static int countToken(String str, String token) {
        int count = 0;
        while (str.indexOf(token) != -1) {
            count++;
            str = str.substring(str.indexOf(token) + token.length());
        }
       // System.out.println(token + "出现的次数:" + count);
        return count;
    }

    public static void main(String[] args) {
        String strInput = new String("你是猪你是猪你是猪你是猪你是猪你是猪你是猪你是猪你是猪afdadfdasffafadsfdhjgfhjgfhfadsssssss");
        doString(strInput);
        doString("aavzcadfdsfsdhshgWasdfasdf");
        doString("aasss");
    }
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值