牛客网华为算法题解-huawei_algo
第85题,最长子回文字符串
第95题人民币转换 题干: 题干分析,就是说输入一串double类型的数值,精确到小数点后两位,然后转换成元角分的读法
public class Main {
public static String[] RMB = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
public static String[] unit1 = {"元", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟"};
public static String[] unit2 = {"角", "分"};
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
String s = sc.next();
String result = "";
if(s.contains(".")) {
String s1 = s.substring(s.indexOf('.') + 1);
String s2 = s.substring(0, s.indexOf('.'));
result = "人民币" + integer(s2) + decimal(s1);
} else
result = "人民币" + integer(s) + "整";
System.out.println(result);
}
}
// 处理整数
public static String integer(String s) {
if(s.length() == 1 && s.charAt(0) == '0') return "";
StringBuilder sb = new StringBuilder();
for (int i = s.length() - 1; i > - 1; i -- )
sb.append(s.charAt(i));
int[] arr = new int[s.length()];
for (int i = 0; i < arr.length; i ++ )
arr[i] = Integer.parseInt(String.valueOf(sb.toString().charAt(i)));
sb.delete(0, sb.length());
for (int i = 0; i < arr.length; i ++ )
sb.append(unit1[i] + RMB[arr[i]]);
sb = sb.reverse();
if(sb.charAt(0) == '壹' && sb.charAt(1) == '拾') sb.deleteCharAt(0);
return sb.toString();
}
// 处理小数
public static String decimal(String s) {
String temp = "";
int[] arr = new int[s.length()];
for (int i = 0; i < arr.length; i ++ )
arr[i] = Integer.parseInt(String.valueOf(s.charAt(i)));
for (int i = 0; i < arr.length; i ++ ) {
if(arr[i] == 0) continue;
temp += RMB[arr[i]] + unit2[i];
}
return temp;
}
}
第102题 字符统计 输入一个只包含小写英文字母和数字的字符串,按照不同字符统计个数由多到少输出统计结果,如果统计的个数相同,则按照ASCII码由小到大排序输出。 本题含有多组样例输入,输入描述: 一个只包含小写英文字母和数字的字符串。 输出描述: 一个字符串,为不同字母出现次数的降序表示。若出现次数相同,则按ASCII码的升序输出。
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s;
while ((s = br.readLine()) != null) {
TreeMap<Character, Integer> map = new TreeMap<>();
for (int i = 0; i < s.length(); i++) {
map.put(s.charAt(i), map.getOrDefault(s.charAt(i), 0) + 1);
}
List<Map.Entry> list = new ArrayList<>(map.entrySet());
Collections.sort(list, (o1, o2) -> (int) o2.getValue() - (int) o1.getValue());
for (Map.Entry entry : list) {
System.out.print(entry.getKey());
}
System.out.println();
}
}
}
第103题 走梅花桩 其实就是找最长上升子序列的问题
第105题 输入 n 个整型数,统计其中的负数个数并求所有非负数的平均值,结果保留一位小数,如果没有非负数,则平均值为0
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
float positive = 0;
int negative = 0;
float sum = 0;
while (sc.hasNextInt()){
int cur = sc.nextInt();
if (cur >= 0){
positive++;
sum += cur;
}else{
negative++;
}
}
System.out.println(negative);
System.out.printf("%.1f\n", sum/positive);
}
}