20210703leetcode字符排序(数组重复值)

这篇博客介绍了如何根据字符出现频率对字符串进行排序。首先回顾了StringBuffer的添加和插入方法,然后利用Map统计字符串中每个字符的出现次数,并对Map按值进行排序。通过将字符数组转换为List并应用Collections.sort进行降序排列,最后使用StringBuffer构建新的排序字符串。博客还展示了如何将字符串拆分成字符数组并进行操作。
摘要由CSDN通过智能技术生成
451. 根据字符出现频率排序

输入:
“tree”

输出:
“eert”

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

来源:力扣(LeetCode)

###1.要用到StringBuffer的添加方法

首先复习字符串方法。

StringBuffer 长度和内容可变

StringBuffer sb=new StringBuffer(50);

sb.capacity();//容量50;
sb.length();//长度为0;

StringBuffer sb2=new StringBuffer("hello");

sb3.capacity();//容量21;
sb3.length();//长度为5;

//2.StringBuffer的添加功能
StringBuffer sb3=new StringBuffer();

sb3.append("hello");
sb3.append("world"); //helloworld;

//3.StringBuffer的插入功能;

sb.insert(5,666);//hello666world;


###2.要用到Map的方法(利用Map统计数组中重复个数)

利用map的特性可以储存键值对

//注意声明字符数组的格式!!!
String[] arr =new String[]{"a","b","a","b"};


Map<String,Integer>map = new HashMap<>();

//接口的引用指向实现类的对象 可以理解为向上转型

for(String str:arr){
    Integer num = map.get(str);
    if(num = null){
        map.put(str,1);
    }else{
        map(str,num+1);        
    }
}

//遍历
Set set = map.entrySet();

//entrySet就是把(KEY-VALUE)一对一对的放入Set集合中

Iterator it =set.itrator();

//entrySet进行迭代,存放到迭代器中

//Iterator就像指针一样,next()就能找到它的下一个元素。

while(it.hasNext()){
    Map.Entry<String,Integer> entry =(Entry<String,Integer>)it.next();
    
    //Map.Entry是Map的一个内部接口。
    
    System.out.println("单词"+entry.getKey()+"出现次数:"+entry.getValue());
    
}

3.把字符串分割成字符数组

		String str="tree";

		String[] arr = str.split("");

		for(String s:arr) {
            
			System.out.println(s);
            
		}

###4.Map按值排序

Collections 是一个工具类,sort是静态方法

作用: 对list进行排序

//转化成list
List<String> list = new ArrayList<>(map.keySet());



Collections.sort(list, (a, b) -> map.get(b) - map.get(a));

题解:

class Solution {
    public String frequencySort(String s) {
        String[] arr = s.split("");
		 
		 Map<String,Integer>map =new HashMap<>();
		 
		 for(String str:arr) {
			 Integer num = map.get(str);
			 if(num==null) {
				 map.put(str, 1);
			 }else {
				 map.put(str, num+1);
			 }
		 }
		 
        //转换成String类型的list
		 List<String> list = new ArrayList<>(map.keySet());
        //降序 排序
		 Collections.sort(list, (a, b) -> map.get(b) - map.get(a));
         StringBuffer bf = new StringBuffer();
         int size = list.size();

         for(int i = 0;i<size ;i++){

            String c = list.get(i); 

            int num = map.get(list.get(i));


            for(int j = 0;j<num;j++){
                
                bf.append(c);

            }

         }
         return bf.toString();


    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值