Java机试题:名字的漂亮度
描述
给出一个名字,该名字有26个字符组成,定义这个字符串的“漂亮度”是其所有字母“漂亮度”的总和。
每个字母都有一个“漂亮度”,范围在1到26之间。没有任何两个不同字母拥有相同的“漂亮度”。字母忽略大小写。
给出多个名字,计算每个名字最大可能的“漂亮度”。
本题含有多组数据。
数据范围:输入的名字长度满足 ![]()
import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.Scanner; public class Main { // 个数 public static int m; public static void main(String[] args) { Scanner scanner = new Scanner(System.in); m = Integer.valueOf(scanner.nextLine()); for (int i=0; i<m; i++) { String name = scanner.nextLine(); // 给名字中字母赋值范围为1~26,要尽可能大,则重复的,就要给最大值。若两个字母一样多,则另一个则-1 List<Character> chars = new ArrayList<Character>(); List<En> ens = new ArrayList<En>(); for (int j = 0; j < name.length(); j++) { char enName = name.charAt(j); if(!chars.contains(enName)) { En en = new En(); en.setEnName(enName); en.setNums(name.replaceAll("[^"+enName+"]", "").length()); chars.add(enName); ens.add(en); } } // 排序,重复最大的字母,从26开始,需要倒序 Collections.sort(ens, new Comparator<En>() { @Override public int compare(En o1, En o2) { return o2.getNums() - o1.getNums(); } }); // 计算漂亮度 int pretty = 0; for (int j = 0; j < name.length(); j++) { for (int k = 0; k < ens.size(); k++) { if(ens.get(k).getEnName() == name.charAt(j)) { pretty += (26 - k); break; } } } System.out.println(pretty); } } public static class En { char enName; // 字符名称 int nums;// 字符个数,用于赋值,计算出最大的漂亮度 public char getEnName() { return enName; } public void setEnName(char enName) { this.enName = enName; } public int getNums() { return nums; } public void setNums(int nums) { this.nums = nums; } } }
题目来源:牛客网
浙公网安备 33010602011771号