奇安信笔试 奇安信笔试题 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多种语言版本,持续更新中。

全部评论

相关推荐

2024年2月22日1、基本情况(毕业时间、实习时间、实习周期)2、Java基本类型(寄:8种)3、集合用过哪些?4、hashmap了解多吗?看过源码吗?hashmap的数据结构?5、多线程了解吗?用过吗?6、实习:线程池解决什么问题?(逻辑回答有点混乱)7、线程池的核心参数?创建一个线程池,怎么设定那个核心线程数?8、在Spring中用到哪些设计模式?(回答不好,不熟悉!!)9、三次握手分别干了什么事情?10、Spring里的AOP原理是怎么实现的?11、MySql的默认事务隔离级别?12、总结一下MVCC吗?13、缓存穿透和缓存击穿的区别?对应的解决方案?14、实习经历中:redis保证生成唯一合同号是如何实现的?15、实习中:参与数据库的设计?有遵循什么数据库的规范?16、数据库的三范式17、从上一家公司实习完有什么收获吗?18、算法题:单向链表,如何快速找到中间节点?双指针(快慢指针)19、思维题:四个跑道,八匹马,如何找到最快的马,需要跑几次?20、思维题:四个跑道,十六匹马呢?21、贪心算法的理解?22、反问●&nbsp;面试过程中,哪里回答不好,需要提升?(客套整理还可以,回答技巧不好,回答问题要学会有自己的总结:脉络、设计模式、逻辑题)●&nbsp;表达需要提升(推荐看书《金字塔原理》)●&nbsp;简历排版有哪些需要改进?(增加:项目中解决了什么问题?专业技能模块优化一些,添加一些总结再分的东西:如Java基础和设计模式分开,不要写一块?突出亮点!)总结:1、基础不够牢固(没办法十全十美,但是要争取尽量回答完善)2、回答前先总结思考一下,不要想到啥说啥,思绪混乱3、语气有点唯唯诺诺,自信大方一点4、增加知识广度,知识点和项目之间串联起来5、回答问题,可以先讲清楚这个知识点是什么?用来做什么?能实现什么效果?#我的实习求职记录#
查看23道真题和解析 我的实习求职记录
点赞 评论 收藏
分享
1 1 评论
分享
牛客网
牛客企业服务