leetcode-根据字符出现的频率排序(Hashmap方法和桶排序两种方法)

给定字符串,要求按照字符出现频率降序排列。本文介绍两种解法:1. 使用HashMap存储字符频率,排序后输出;2. 利用桶排序思想解决此问题。详细解析及示例代码见正文。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:
给定一个字符串,请将字符串里的字符按照出现的频率降序排列。

示例 1:
输入:
“tree”
输出:
“eert”

解释:
'e’出现两次,'r’和’t’都只出现一次。
因此’e’必须出现在’r’和’t’之前。此外,"eetr"也是一个有效的答案。

示例 2:
输入:
“cccaaa”
输出:
“cccaaa”

解释:
'c’和’a’都出现三次。此外,"aaaccc"也是有效的答案。
注意"cacaca"是不正确的,因为相同的字母必须放在一起。

示例 3:
输入:
“Aabb”
输出:
“bbAa”

解释:
此外,"bbaA"也是一个有效的答案,但"Aabb"是不正确的。
注意’A’和’a’被认为是两种不同的字符。

题解:这道题有两种解法,1.遍历字符串,将字符及其频率的键值对存储到map中,然后对map根据value值进行排序;2.遍历字符串,将字符及其频率的键值对存储到map中,使用桶排序进行求解。

1.Hashmap方法:

package com.ljq.sort;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;

/** 
* @author 作者 Your-Name: 
* @version 创建时间:2019年8月28日 上午9:48:10 
* 类说明 
*/
public class CharFreSort {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		Scanner scanner = new Scanner(System.in);
		
		while(scanner.hasNext()) {
			String string = scanner.nextLine();
			
			String ret = frequencySort(string);
			
			System.out.println(ret);
			
		}
		
		scanner.close();
	}
	
	public static String frequencySort(String s) {
		StringBuffer ret = new StringBuffer();
		if(s.length()<=0) {
			return ret.toString();
		}
		
		Map<Character, Integer> map = new HashMap<Character, Integer>();
		for(int i=0;i<s.length();i++) {
			map.put(s.charAt(i),map.getOrDefault(s.charAt(i), 0)+1);
		}
		
		/*
		 * map根据value值排序
		 */
		
		List<Map.Entry<Character, Integer>> list = new ArrayList<Map.Entry<Character,Integer>>(map.entrySet());
		Collections.sort(list, new Comparator<Entry<Character, Integer>>() {

			@Override
			public int compare(Entry<Character, Integer> arg0, Entry<Character, Integer> arg1) {
				// TODO 自动生成的方法存根
				return arg1.getValue()-arg0.getValue();
			}
		});
		
		for(Entry<Character, Integer> item:list) {
			int count = item.getValue();
			char key = item.getKey();
			for(int i=0;i<count;i++) {
				ret.append(key);
			}
		}
		return ret.toString();
	}

}

2.桶排序方法

package com.ljq.sort;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.Set;

/** 
* @author 作者 Your-Name: 
* @version 创建时间:2019年8月28日 上午10:17:45 
* 类说明 
*/
public class BucktSortChar {

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		Scanner scanner = new Scanner(System.in);
		
		while(scanner.hasNext()) {
			String string = scanner.nextLine();
			
			String ret = frequencySort(string);
			System.out.println(ret);
		}
		
		scanner.close();
	}
	
	public static String frequencySort(String s) {
		StringBuffer ret = new StringBuffer();
		if(s.length()<=0) {
			return ret.toString();
		}
		
		Map<Character,Integer> map = new HashMap<Character, Integer>();
		for(int i=0;i<s.length();i++) {
			map.put(s.charAt(i), map.getOrDefault(s.charAt(i), 0)+1);
		}
		
		List<Character>[] busket = new ArrayList[s.length()+1];
		/*
		 * 桶的下标代表频次,桶的元素为出现下标次数的字符
		 */
		Set<Entry<Character, Integer>> set = map.entrySet();
		for(Entry<Character, Integer> item:set) {
			int value = item.getValue();
			char key = item.getKey();
			
			if(busket[value]==null) {
				busket[value] = new ArrayList<Character>();
			}
			busket[value].add(key);
		}
		
		for(int i=busket.length-1;i>=0;i--) {
			if(busket[i]==null) {
				continue;
			}
			for(int j=0;j<busket[i].size();j++) {
				char key = busket[i].get(j);
				for(int k=0;k<i;k++) {
					ret.append(key);
				}
			}
		}

		return ret.toString();
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值