java 将字符串里面的字符按照出现的频率降序排列

5 篇文章 0 订阅
2 篇文章 0 订阅

题目

//给定一个字符串,将字符串里面的字符按照出现的频率降序排列。
//例1:输入:“cbbaaa”,输出:“aaabbc”
//例2:输入:“cccaa”,输出:“cccaa”
//例3:输入:“aaAAA”,输出:“AAAaa”

思路

  1. 首先需要将字符串中的的字符出现的频率进行分类记录,
  2. 然后将字符串中字符按照出现的频率进行重组,保证同一个字符连续出现,题中没有不连续的字符(如:sdfdsada)
  3. 重组之后,按照相同字符组成的字符串的长度进行排序
  4. 将排序之后的字符串最为结果返回

实现代码

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

/**
 *  描述: 
 *  作者: 郎国峰 
 *  时间: 2019年9月27日 下午8:10:44
 */
public class SecondQuestions {
	
	public static void main(String[] args) {
		System.out.println(sort("aaAAA"));
	}
	
	/**
	 * 
	* @Title: sort 
	* @Description: 给定一个字符串,将字符串里面的字符按照出现的频率降序排列
	* @date 2019年9月27日 下午8:13:27
	* @param @param str
	* @param @return    设定文件 
	* @return String    返回类型 
	* @throws
	 */
	public static String sort(String str) {
		//将字符串转换成char数组
		char[] chars = str.toCharArray();
		//声明一个HashMap用来保存每个字符出现的次数
		HashMap<Character, Integer> map = new HashMap<Character,Integer>();
		for (int i = 0; i < chars.length; i++) {
			char c = chars[i];
			if( map.get(c) == null) {
				map.put(c, 1);
			}else {
				int j = map.get(c);
				map.put(c, ++j);
			}
		}
		
		//将不同字符按照出现的次数进行重组字符串,并放到数组中
		String[] strs = new String[map.size()];
		int i = 0;
		for ( Entry<Character, Integer> entrty : map.entrySet()) {
			
			StringBuilder sb = new StringBuilder();
			
			for (int j = 0; j < entrty.getValue(); j++) {
				sb.append(entrty.getKey());
			}
			
			strs[i] = sb.toString();
			i++;
		}
		
		//遍历数组中的字符串,按照字符串的长度进行排序,也就是按出现频率进行排序
		for (int j = 0; j < strs.length-1; j++) {
			for (int k = j+1; k < strs.length; k++) {
				
				if(strs[j].length() < strs[k].length()) {
					String s = strs[j];
					strs[j] = strs[k];
					strs[k] = s;
				}
			}
		}
		
		//将排序之后的字符串数组中的字符重新组装成字符串返回
		StringBuilder rs = new StringBuilder();
		for (int j = 0; j < strs.length; j++) {
			rs.append(strs[j]);
		}
		
		return rs.toString();
	}
	
}

总结

最后是实现了功能,但是感觉实现的思路和方法不是很好,如果您有更好的思路和方法,希望能不吝赐教,谢谢!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值