自己刷在线编程题用到好多次hashmap,刷了三四遍才能记住hashmap表的排序。
我就不生讲了,直接用刷的一个题目为例
给出一个01字符串(长度不超过100),求其每一个子串出现的次数。
输入描述:
输入包含多行,每行一个字符串。
输出描述:
对每个字符串,输出它所有出现次数在1次以上的子串和这个子串出现的次数,输出按字典序排序。
示例1
输入
复制
10101
输出
复制
0 2 01 2 1 3 10 2 101 2
刚开始做这个题目,我在想这是不是一个动态规划,或者其他算法简便的计算,最后,没有这回事,它就是遍历,但是一个注意的是用hahsmap计数,然后排序,然后输出
import java.util.*;
import java.util.Collections;
public class Main{
public static void main(String []args)
{
Scanner sc=new Scanner(System.in);
String s=sc.next();
//这个地方就是把数组遍历拆分,然后装进map中
Map<String,Integer> map=new HashMap<String,Integer>();
for(int i=1;i<=s.length();i++)
{
for(int j=0;j<i;j++)
{
String sub=s.substring(j,i);
if(map.containsKey(sub))
map.put(sub,map.get(sub)+1);
else
map.put(sub,1);
}
}
//排序
//1.转为List
List<Map.Entry<String,Integer>> list=new ArrayList<>(map.entrySet());
//2.重写排序,这里实现的是根据key值排序,也可以根据value排序
Collections.sort(list,new Comparator<Map.Entry<String, Integer>>()
{
@Override
public int compare(Map.Entry<String,Integer> arg0, Map.Entry<String,Integer> arg1)
{
return arg0.getKey().compareTo(arg1.getKey());
}
});
//3.list就是一个排好的map的集合
for(Map.Entry<String,Integer>e:list)
{
if(e.getValue()>1)
System.out.println(e.getKey()+" "+e.getValue());
}
}
}