工号不够用了怎么办? - 华为OD统一考试(E卷)

2024华为OD机试(E卷+D卷)最新题库【超值优惠】Java/Python/C++合集

华为od机试

题目描述

3020年,空间通信集团的员工人数数量突破20亿,现有工号系统不够用的窘境。

现在,请你负责调研新工号系统。继承历史传统,新工号系统由小写英文字母(a-z)和数字(0-9)两部分构成。

新工号分一段英文字符开头,之后跟着一段数字,例如"aaaahw0001","a12345","abcd1","a00"。

注意新工号数字不能全字母或者数字,允许数字部分有前导0或者全为0。

但是过长的工号会增加同事们的记忆成本,现给出新工号至少需要分配的人数X和新工号中字母的长度Y,求新工号中数字的最短长度Z。

输入描述

一行两个非负整数X和Y,代表字母单个字母空间总数。

0 <= X <= 2^50 - 1

0 < Y <= 5

输出描述

输出新工号中数字部分的最短长度。

示例1

输入:
260 1

输出:
1

示例2

输入:
26 1

输出:
1

说明:
数字长度不能为0

题解

这道题的目的是在给定新工号分配的员工数量 X 和字母长度 Y 的情况下,求出数字部分的最短长度 Z

解题思路

  1. 字母部分的组合数量: 由于字母只能是小写英文字母(a-z),总共有26个字母,因此字母部分的总数可以表示为
  2. 数字部分的组合数量: 数字部分可以由任意位数的数字组成,且数字部分可以有前导0,因此对于Z位数字,总共有 种组合。
  3. 目标: 总的工号数应该满足能分配给至少 X 个员工,所以要找出一个最小的 Z,使得字母部分和数字部分的组合数量 不小于 X
  4. 二分查找: 我们可以用二分法来快速找到数字部分的最小长度 Z。初始的搜索区间为 [0, 20],然后逐步缩小区间,通过判断 是否大于等于 X 来更新搜索区间。

时间复杂度

二分查找的时间复杂度为 O(log⁡Z),由于最大搜索区间为20,因此时间复杂度接近常数时间。

Java

import java.util.Scanner;
/**
 * @author code5bug
 */
public class Main {
    
    public static boolean ok(long x, int y, int z) {
        // 判断26^y * 10^z 是否大于等于 X
        return Math.pow(26, y) * Math.pow(10, z) >= x;
    }
    
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        long x = scanner.nextLong();
        int y = scanner.nextInt();
        
        int left = 0, right = 20;
        while (left + 1 < right) {
            int mid = (left + right) / 2;
            if (ok(x, y, mid)) {
                right = mid;
            } else {
                left = mid;
            }
        }
        
        System.out.println(right);
    }
}

Python

import math

def ok(x, y, z):
    # 判断26^y * 10^z 是否大于等于 X
    return math.pow(26, y) * math.pow(10, z) >= x

def main():
    x, y = map(int, input().split())
    
    left, right = 0, 20
    while left + 1 < right:
        mid = (left + right) // 2
        if ok(x, y, mid):
            right = mid
        else:
            left = mid
    
    print(right)

if __name__ == "__main__":
    main()

C++

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

bool ok(long long x, int y, int z)
{
    // 判断26^y * 10^z 是否大于等于 X
    return pow(26, y) * pow(10, z) >= x;
}

int main()
{
    long long x;
    int       y;
    cin >> x >> y;

    int left = 0, right = 20;
    while (left + 1 < right) {
        int mid = (left + right) / 2;
        if (ok(x, y, mid)) {
            right = mid;
        } else {
            left = mid;
        }
    }

    cout << right << endl;
}

希望这个专栏不仅能帮您成功通过华为机试,还能让您熟练掌握算法。

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

#面经##华为od##华为od机试##华为od题库##华为#
全部评论
可以直接求10的对数解
点赞 回复 分享
发布于 2024-10-30 16:21 上海

相关推荐

点赞 评论 收藏
分享
05-19 19:57
蚌埠学院 Python
2237:Gpa70不算高,建议只写排名,个人技能不在多而在精,缩到8条以内。项目留一个含金量高的,减少间距弄到一页,硕士简历也就一页,本科不要写很多
实习,投递多份简历没人回...
点赞 评论 收藏
分享
05-11 11:48
河南大学 Java
程序员牛肉:我是26届的双非。目前有两段实习经历,大三上去的美团,现在来字节了,做的是国际电商的营销业务。希望我的经历对你有用。 1.好好做你的CSDN,最好是直接转微信公众号。因为这本质上是一个很好的展示自己技术热情的证据。我当时也是烂大街项目(网盘+鱼皮的一个项目)+零实习去面试美团,但是当时我的CSDN阅读量超百万,微信公众号阅读量40万。面试的时候面试官就告诉我说觉得我对技术挺有激情的。可以看看我主页的美团面试面经。 因此花点时间好好做这个知识分享,最好是单拉出来搞一个板块。各大公司都极其看中知识落地的能力。 可以看看我的简历对于博客的描述。这个帖子里面有:https://www.nowcoder.com/discuss/745348200596324352?sourceSSR=users 2.实习经历有一些东西删除了,目前看来你的产出其实很少。有些内容其实很扯淡,最好不要保留。有一些点你可能觉得很牛逼,但是面试官眼里是减分的。 你还能负责数据库表的设计?这个公司得垃圾成啥样子,才能让一个实习生介入数据库表的设计,不要写这种东西。 一个公司的财务审批系统应该是很稳定的吧?为什么你去了才有RBAC权限设计?那这个公司之前是怎么处理权限分离的?这些东西看着都有点扯淡了。 还有就是使用Redis实现轻量级的消息队列?那为什么这一块不使用专业的MQ呢?为什么要使用redis,这些一定要清楚, 就目前看来,其实你的这个实习技术还不错。不要太焦虑。就是有一些内容有点虚了。可以考虑从PR中再投一点产出
投递美团等公司8个岗位
点赞 评论 收藏
分享
找个工作&nbsp;学历是要卡的&nbsp;要求是高的&nbsp;技能不足是真的&nbsp;实习经验是0的&nbsp;简历无处可写是事实的&nbsp;钱不好赚是真的&nbsp;想躺平又不敢躺&nbsp;也不甘心躺&nbsp;怕自己的灵感和才华被掩埋甚至从未被自己发现&nbsp;又质疑自己是否真正有才华
码农索隆:你现在啊,你心里都明白咋回事,但是你没办法改变现状,一想到未来,你又没有信心狠下心来在当下努力。 得走出这种状态,不能一直困在那里面,哪不行就去提升哪,你一动不动那指定改变不了未来,动起来,积少成多才能越来越好
点赞 评论 收藏
分享
评论
3
3
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务