奇安信笔试 奇安信笔试题 0513

笔试时间:2024年05月13日

历史笔试传送门:2023秋招笔试合集

第一题

题目:double数

定义double数是位数为偶数且前一半和后一半完全相同的正整数,如: 1212,11,1010 是double数,而313,25,990不是double数。牛牛想知道 [1,n] 内有多少double数。函数传入一个正整数 n ,返回 [1,n] 内double数的个数。

数据范围:1<=n<=10^12

样例输入一

25

样例输出一

2

说明

[1,25] 内的double数有: 11,22,因此答案为2。

样例输入二

2

样例输出二

0

说明

[1,2]内没有double数。

样例输入三

3154354

样例输出三

999

参考题解

对于每一个偶数位长度(如2位、4位、6位等),生成可能的double数。例如:

对于2位数字:生成如11, 22, ..., 99。

对于4位数字:以前两位从10到99,重复它形成如1010, 1111, ..., 9999的数。

我们只需要枚举长度为6的数字即可,所以复杂度是不会爆的。

C++:[此代码未进行大量数据的测试,仅供参考]

class Solution {
public:
    int DoubleNumber(int n) {
        int cnt = 0;
        int i = 1;
        while (true) {
            int st = std::pow(10, i - 1);
            int end = std::pow(10, i) - 1;
            for (int half_num = st; half_num <= end; ++half_num) {
                std::string str_half = std::to_string(half_num);
                std::string str_double = str_half + str_half;
                int double_num = std::stoi(str_double);
                if (double_num > n) {
                    return cnt;
                }
                cnt++;
            }
            i++;
        }

        return cnt;
    }
};

Java:[此代码未进行大量数据的测试,仅供参考]

public class Solution {
    public int DoubleNumber(int n) {
        int cnt = 0;
        int i = 1;
        while (true) {
            int st = (int) Math.pow(10, i - 1);
            int end = (int) Math.pow(10, i) - 1;
            for (int half_num = st; half_num <= end; half_num++) {
                String str_half = Integer.toString(half_num);
                String str_double = str_half + str_half;
                int double_num = Integer.parseInt(str_double);
                if (double_num > n) {
                    return cnt;
                }
                cnt++;
            }
            i++;
        }

        // 这个return理论上是不会被执行的,但为了代码完整性保留
        return cnt;
    }

Python:[此代码未进行大量数据的测试,仅供参考]

class Solution:
    def DoubleNumber(self, n):
        cnt = 0
        i = 1
        while True:
            st = 10 ** (i - 1)
            end = 10 ** i - 1
            for half_num in range(st, end + 1):
                double = int(str(half_num) + str(half_num))
                if double > n:
                    return cnt
                cnt 

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

2024 BAT笔试合集 文章被收录于专栏

持续收录字节、腾讯、阿里、美团、美团、拼多多、华为等笔试题解,包含python、C++、Java多种语言版本,持续更新中。

全部评论

相关推荐

10-16 11:02
已编辑
哈尔滨工程大学 C++
part1.自我介绍;part2:项目:将一个你最熟悉的项目(讲了项目A在车企·域控器的OTA)服了,撞枪口上了&nbsp;,他刚好是做这一块的;疯狂深挖;(1)你们控制板的主控芯片是哪一个?为什么要以这种方式实现监控?刷写逻辑是什么?A/B区切换逻辑?(2)主控并发获取系统快照写入缓存以后,主线写入日志过程是写入主控日志还是系统日志?如果是写入主控日志,你这种实现在多写入场景下的时间和原有时间帧能同步吗?怎么同步?(3)刚刚你提到了线程池的入口函数的封装和信号量触发,在哪里触发?线程池的实现的源码有看吗?基于什么实现的?(4)你们的开发是基于AutoSar还是自己的编译环境?有没有兼容autosar的服务?怎么实现的?(5)实际项目中有涉及过中断操作吗?(6)像你所说的缓存写入日志的场景如果出现异常或是掉电程序崩溃时你针对缓存数据和日志系统有什么兜底措施吗?怎么实现?回滚的策略是什么?part3:场景八股(1)说一个熟悉的stl容器,底层是基于什么实现的?是线程安全的吗?你在什么场景下会用到这个数据结构?插入和删除的时间的复杂度是多少?查找的时间复杂度呢?(2)将一下lambda表达式有哪些参数可选;各自实现什么功能?你刚刚提到的了返回值自动类型推导,之前还有个mutable参数是什么功能?可以输入什么数据类型?(mutable&nbsp;默认:值捕获的变量在&nbsp;lambda&nbsp;内是&nbsp;const&nbsp;的,不能修改。加&nbsp;mutable:允许修改值捕获的变量副本(不影响外部)。)(3)用过智能指针吗?讲一个项目中用到的场景?有什么优缺点?shared_ptr的引用计数的数据类型是什么?(4)刚刚你提到了熟悉多线程编程,我这里有两个线程,线程A获取锁执行某一模块功能,线程B同理;同时只能由一个线程获取锁,当前内部功能的实现超出预期,线程A不释放锁;如何在线程A功能不受损的情况下让线程B按照原有时序预期获取锁?只用锁操作;(描述有一点点问题,因为最后答案还是设置超时机制强制释放锁);(5)了解UDS服务和CAN通信吗?反问,公司部门业务(车联网应用)工作作息;面试官太专业,语气温和,面试虽然答得依托但是体验狠好;
查看12道真题和解析
点赞 评论 收藏
分享
评论
1
2
分享

创作者周榜

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