Java一串由数字组成的字符串,求各个数字出现的次数,并按出现次数的大小从小到大 【问题来源:吾爱破解】

(第一次写,有点紧张,写的不好多包涵)

https://www.52pojie.cn/thread-991326-1-1.html
(出处: 吾爱破解论坛)
 

 

下面进入正题:

Java一串由数字组成的字符串,求各个数字出现的次数,并按出现次数的大小从小到大排序,若出现的次数相同
若出现的次数相同,那就比较最后出现的位置,例如我给出的那个字符串,8和5都是出现2次,但8最后出现的位置比5最后出现的位置靠后,那么8就排在5的后面
。例如:
String s = "10771034948754277771578";
最后输出结果应该是
6:0次
3:1次
9:1次
2:1次
0:2次
5:2次
8:2次
4:3次
1:3次
7:8次

 

代码

class Num{
    public int num;  //数字
    public int count;//次数
    public int index;//首次出现位置
    public int lastIndex;//最后出现位置
}

public static void main(String[] args) {
        String s = "10771034948754277771578";  //源字符串
        List<Num> lNum = new ArrayList<Num>(); 
        int[] count = {0,0,0,0,0,0,0,0,0,0}; //计数器
        for(int i = 0;i<s.length();i++) {
            int val = Integer.valueOf(s.charAt(i)+"");
            count[val]++;
        }
        for(int i = 0;i<count.length;i++) {
            Num n = new Num();
            n.num = i;
            n.count = count[i];
            n.index = s.indexOf(i+"");
            n.lastIndex = s.lastIndexOf(i+"");
            //插入位置
            int p = 0;
            //lNum 小于 0  直接在 位置 0 的位置添加
            if(lNum.size() > 0) {
                for(;p<lNum.size();p++) {
                    Num o = lNum.get(p);
                    //如果当前元素的下标为-1,continue
                    if(o.index<0) continue;
                    //如果新增对象下标为-1 或者当前元素的出现次数 大于新增对象的出现次数 break;
                    if(n.index<0 || o.count>n.count) break;
                    //如果出现次数相等的情况下
                    if(o.count == n.count ) {
                        //如果新增元素 最后出现位置 在当前元素之后 continue; 否则 break;
                        if(n.lastIndex > o.lastIndex) continue;
                        else break;
                    }
                }
            }
            lNum.add(p,n);
        }
        lNum.forEach(n ->{
            System.out.println(n.num +":"+n.count+"次");
        });
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值