靠谱的车- 华为OD统一考试(C卷)

news/2024/7/20 16:36:30 标签: 华为od, c语言, 开发语言, 算法, python, java, c++

靠谱的车- 华为OD统一考试(C卷)

OD统一考试(C卷)

分值: 100分

题解: Java / Python / C++

alt

题目描述

程序员小明打了一辆出租车去上班。出于职业敏感,他注意到这辆出租车的计费表有点问题,总是偏大。

出租车司机解释说他不喜欢数字4,所以改装了计费表,任何数字位置遇到数字4就直接跳过,其余功能都正常。

比如:

  • 23再多一块钱就变为25;

  • 39再多一块钱变为50;

  • 399再多一块钱变为500;

小明识破了司机的伎俩,准备利用自己的学识打败司机的阴谋。

给出计费表的表面读数,返回实际产生的费用。

输入描述

只有一行,数字N,表示里程表的读数。

(1<=N<=888888888)。

输出描述

一个数字,表示实际产生的费用。以回车结束。

示例1

输入
5
输出
4
说明
5表示计费表的表面读数。
4表示实际产生的费用其实只有4块钱。

示例2

输入
17
输出
15
说明
17表示计费表的表面读数。
15表示实际产生的费用其实只有15块钱。

示例3

输入
100
输出
81
说明
100表示计费表的表面读数。
81表示实际产生的费用其实只有81块钱。

题解

此题采用记忆化搜索(实在不会可以暴力枚举所有的数字,然后去除掉数字中含有4的数字,即为答案,由于题目数据范围较大,暴力肯定会超时)。

代码大致描述:

  1. 通过递归函数 solve 处理计费表的每一位数字,考虑是否跳过数字4,是否有限制,是否是数字。
  2. 使用记忆化缓存 cache 避免重复计算,提高效率。
  3. 遍历计费表的每一位,根据不同情况调用递归函数。
  4. 返回计算结果。

Java

java">import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String s = in.nextLine();
        Solution solution = new Solution();
        System.out.println(solution.solve(s.toCharArray(), 0, true, false));
    }
}


class Solution {
    int[] cache;

    public Solution() {
        this.cache = new int[15];
        Arrays.fill(this.cache, -1);
    }

    /**
     * 
     * @param w 原始字符数组
     * @param idx   构造索引位置
     * @param isLimit   构造时是否有限制
     * @param isNum 是否是数字
     * @return
     */
    public int solve(char[] w, int idx, boolean isLimit, boolean isNum) {
        if (idx == w.length) return isNum ? 1 : 0;

        // 返回记忆化缓存结果
        if (!isLimit && isNum && this.cache[idx] != -1) return this.cache[idx];

        int cnt = 0;
        // 高位不选择元素时,比如 1235(4位数) 只构造 3位的数字的结果数
        if (!isNum) cnt += solve(w, idx + 1, false, false);

        // w[idx] 的上限
        int up = isLimit ? (w[idx] - '0') : 9;
        // 当前 idx 位置枚举所有可能的值
        for (int d = isNum ? 0 : 1; d <= up; d++) {
            if (d != 4) cnt += solve(w, idx + 1, isLimit && d == up, true);
        }

        if (!isLimit && isNum) {
            this.cache[idx] = cnt;
        }

        return cnt;
    }
}

C++

#include <bits/stdc++.h>
using namespace std;

const int N=15;
int f[N],n;
string s;

int solve(int i,bool is_limit,bool is_num) {
    if(i==n)  return is_num;
    if (!is_limit && is_num && f[i] != -1)  return f[i];

    int res=0;
    if(!is_num) res=dp(i+1,false,false);
    
    int up=(is_limit)?s[i]-'0':9;
    for(int d=1-is_num; d<=up; d++) {
        if(4!=d) res+=dp(i+1,is_limit&&d==up,true);
    }
    if(!is_limit&&is_num) {
        f[i]=res;
    }
    return res;
}

int main() {
    cin>>s;
    n=s.size();
    memset(f,-1,sizeof(f));
    cout<<solve(0,true,false)<<endl;

    return 0;
}

Python

python">from functools import cache

@cache
def solve(i, is_limit, is_num):
    global s, n
    if i == n:
        return int(is_num)
    
    res = 0
    if not is_num:
        res = solve(i + 1, False, False)

    up = int(s[i]) if is_limit else 9
    for d in range(1 - int(is_num), up + 1):
        if d != 4:
            res += solve(i + 1, is_limit and d == up, True)

    return res


if __name__ == "__main__":
    s = input()
    n = len(s)
    print(solve(0, True, False))

(记忆化搜索)相关练习题

题号题目难易
LeetCode 600600. 不含连续1的非负整数困难
LeetCode 473473. 火柴拼正方形中等

🙏整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏


http://www.niftyadmin.cn/n/5258353.html

相关文章

iframe高度自适应里面html内容的高度

在Angular中&#xff0c;要确保iframe的高度一定大于加载的外部HTML内容的高度&#xff0c;你可以使用Angular的HostListener和Renderer2来实现动态设置iframe的高度。 首先&#xff0c;在组件类中引入Renderer2和ViewChild&#xff1a; typescript import { Component, Rend…

【Kubernetes】存储类StorageClass

存储类StorageClass 一、StorageClass介绍二、安装nfs provisioner&#xff0c;用于配合存储类动态生成pv2.1、创建运行nfs-provisioner需要的sa账号2.2、对sa授权2.3、安装nfs-provisioner程序 三、创建storageclass&#xff0c;动态供给pv四、创建pvc&#xff0c;通过storage…

第七章 SpringCloud Alibaba Sentinel–服务容错

高并发带来的问题 在微服务架构中&#xff0c;我们将业务拆分成一个个的服务&#xff0c;服务与服务之间可以相互调用&#xff0c;但是由于网络 原因或者自身的原因&#xff0c;服务并不能保证服务的 100% 可用&#xff0c;如果单个服务出现问题&#xff0c;调用这个服务就会 …

【Linux环境搭建】Ubuntu 22 安装 InfluxDB 1.8

这里写目录标题 一、下载安装二、启动 一、下载安装 查看安装包 apt-cache search influxdbwget -qO- https://repos.influxdata.com/influxdata-archive_compat.key | sudo apt-key add -source /etc/lsb-releaseecho "deb https://repos.influxdata.com/${DISTRIB_ID,…

18、Web攻防——ASP安全MDB下载植入IIS短文件名写权限解析

文章目录 一、MDB默认下载1.1 搭建IIS网站1.2 搭建网站会出现的一些问题1.2 攻击思路 二、ASP后门植入连接三、IIS短文件名探针——安全漏洞四、IIS6.0文件解析漏洞五、IIS6.0任意文件上传漏洞 一、MDB默认下载 web攻防常见开发语言&#xff1a;ASP、ASPX、PHP、JAVA、Python、…

TCP/IP详解——IP协议,IP选路

文章目录 1. IP 编址1.1 IP 报文头部1.2 进制之间的转换1.3 网络通信1.4 有类 IP 编制的缺陷1.5 变长子网掩码1.6 网关1.7 IP 包分片1.7.1 IP 包分片实例1.7.2 IP 分片注意事项1.7.3 Wireshark 抓取 IP 包分片1.7.4 OmniPeek 抓取 IP 包分片1.7.5 ICMP 不可达差错&#xff08;需…

【Linux】CentOS部分命令

目录 1.文件处理命令2.文件查看命令3.目录查看命令 1.文件处理命令 &#xff08;1&#xff09;.创建文件 mkdir //创建文件夹 touch //创建文件 echo > filename //创建一个空文件 ↑↓ echo "" > filename …

【1day】​万户协同办公平台 iWebPDF/DocumentEdit.jsp文件 SQL注入漏洞学习

注:该文章来自作者日常学习笔记,请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与作者无关。 目录 一、漏洞描述 二、影响版本 三、资产测绘 四、漏洞复现