字符串价值

字符串价值

http://www.nowcoder.com/questionTerminal/9240357eefcf4d938b90bdd5eec3712b

字符串价值

题目难度:中等

知识点:数学逻辑,字符串,数组

解题思路:每一次减去当前字符串中出现次数最多的字符,重复K次后,即可得到价值最小的字符串。

方法一

使用优先队列。首先定义一个数组,用于存储字符串中每一个字符出现的次数,然后定义一个优先队列对每一个字符出现的次数由大到小进行排列,每一次循环,对次数最大的数字减一,直至循环到第k次为止,计算所有字符串出现的次数,最后将所有次数的平方和相加。

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner in=new Scanner(System.in);
        String s=in.next();
        int k=in.nextInt();
        char[] cs = s.toCharArray();
        //定义数组,计算字符串中每一字符出现的次数
        int[] a = new int[26];
        for(char c:cs){
            a[c - 'a']++;
        }
        //定义优先队列存储字符串中字符出现的个数
        PriorityQueue<Integer> pq = new PriorityQueue<>((o1,o2)->{
            return o2 - o1;
        });
        for(int num:a){
            if(num != 0) pq.add(num);
        }
        int i = 0;
        //依次移除数量最多的字符
        while(i < k){
            int num = pq.remove();
            pq.add(num - 1);
            i++;
        }
        int sum = 0;
        for(int num:pq){
            sum += num * num;
        }
        System.out.println(sum);
    }
}

方法二

不使用优先队列。首先定义一个数组,用于存储字符串中每一个字符出现的次数,然后进行k次循环,每次循环找到数组中的最大值,并对最大值减一。循环结束后,将数组中所有值的平方和相加。

import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner in=new Scanner(System.in);
        String s=in.next();
        int k=in.nextInt();
        char[] cs = s.toCharArray();
        //定义数组,计算字符串中每一字符出现的次数
        int[] a = new int[26];
        for(char c:cs){
            a[c-'a']++;
        }
        //循环找到数字中的最大值,并对最大值减一
        for(int i = 0;i<k;i++){
            int maxId = 0;
            for(int j = 0;j<26;j++){
                if(a[j]>a[maxId])
                    maxId = j;
            }
            a[maxId]--;
        }
        int res = 0;
        for(int i =0;i<26;i++){
            res+=a[i]*a[i];
        }
        System.out.println(res);
    }
}

方法三

首先,使用HashMap存储每一个字符出现的次数,然后将字符出现的次数添加进ArrayList中,并进行k次循环,每一次循环首先对ArrayList进行排序,随后对最大值进行减一处理。最后将ArrayList中所有值的平方和相加。

import java.util.*;
public class Main {
    public static void main(String[] args){
        Scanner in=new Scanner(System.in);
        String str=in.nextLine();
        int k=in.nextInt();
        //定义一个HashMap用于存储每一个字符出现的次数
        HashMap<Character,Integer> map=new HashMap();
        for(int i=0;i<str.length();i++){
            char c=str.charAt(i);
            if(!map.containsKey(c))
                map.put(c, 1);
            else{
                map.put(c, map.get(c)+1);
            }
        }
        //将字符出现的次数存储在ArrayList中
        List<Integer> list=new ArrayList(map.values());
        int a[]=new int[list.size()];
        for(int i=0;i<list.size();i++){
            a[i]=list.get(i);
        }
        //对字符的出现次数进行排序,后最大值减一
        for(int i=0;i<k;i++){
            Arrays.sort(a);
            a[a.length-1]--;
        }
        int sum=0;
        for(int i=0;i<a.length;i++)
            sum+=a[i]*a[i];
        System.out.println(sum);
    }
}
全部评论

相关推荐

dongsheng66:如果想进大厂的话,在校经历没必要占这么大篇幅,可以把专业技能单独放一个专栏写,可以加个项目经历
点赞 评论 收藏
分享
有工作后先养猫:太好了,是超时空战警,我们有救了😋
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务