【华为机考E卷】-“出租车计费/靠谱的车”题解思路java

算法每一题,成长每一天~

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、好好好!!


算法要多练多练多练!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值