算法每一题,成长每一天~
C0E18 出租车计费/靠谱的车
真题链接:【持续更新】2024华为 OD 机试E卷 机考真题库清单(全真题库)
思路
Java
import java.util.Scanner;
public class C0E18 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int N = in.nextInt();
char[] arr = Integer.toString(N).toCharArray();
// 每一位的倍率
int max = arr.length;
double[] pows = new double[max];
for (int i = 0; i < max; i++) {
pows[i] = Math.pow(10, max - i - 1);
}
// 逐位计算
double count = 0; // 多算的钱
for (int i = 0; i < arr.length; i++) {
char num = arr[i];
int s = 0;
// 判断当前位
if (num > '4') {
s++; // 大于4,+1
}
// 判断高位对低位的影响
if (i == 1) {
int a0 = arr[0] - '0';
s += (a0 > 4 ? a0 - 1 : a0); // 第二位,取决于第一位的数
}
if (i > 1) {
s += 9; // 从第三位开始,每位都 +9(走过了 14,24,34...94的9个跳过过程)
}
// 这一位的 offset 值
count += s * pows[i];
}
System.out.println(N - (int) count); // 实际金额
}
}
总结
1、前面的思路有问题!!后一位的偏移量多少,与前一位有较大的关系。
题目不难,但是需要一个仔细分析的过程。
2、另外需要注意数字字符 与 int 的运算区别,(‘5’ - 0) 不等于 (‘5’ - ‘0’)
xx:写完总感觉这个方式哪里不舒坦 ??????
然后看了下别人的答案,发现可以利用 进制转换 的思路。
思路:进制转换
题目中,遇4变5,就相当于把原来的 0~9 的十进制,变成了缺少4的 九进制(理解成3+1=5)。
于是:
Java代码如下
import java.util.Scanner;
public class C0E18_1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String line = scanner.nextLine();
int correct = 0;
for (char c : line.toCharArray()) {
int digit = c - '0';
if (digit > 4) {
digit--;
}
correct = correct * 9 + digit; // 每前进一位,高位乘以9,低位加上当前数字
}
System.out.println(correct);
}
}
总结2
1、好好好!!
算法要多练多练多练!!