网易雷火19春招实习笔试题(Leetcode 440 && 845)

本文介绍了网易雷火2019年春季实习生笔试中出现的算法题目,包括LeetCode的386、440、821和845四道题。文章详细解析了每道题目的题目描述、解题思路,并给出了相应的代码实现。重点讨论了如何利用字典序的概念求解问题,同时提到了用双指针和10叉树的思想解决相关问题。
摘要由CSDN通过智能技术生成

网易雷火3.17 人工智能研究员(NLP方向)笔试题:两道算法题都是Leetcode原题。(Leetcode) 440 && 845)

LeetCode 386:

再做440之前,可以先做做386;可以算是440的基础题。

题目描述:

Given an integer n, return 1 - n in lexicographical order.

For example, given 13, return: [1,10,11,12,13,2,3,4,5,6,7,8,9].

Please optimize your algorithm to use less time and space. The input size may be as large as 5,000,000.

题解:

题意其实和440是差不多的,给你一个数n,返回一个字典序的数组。
从给的样例推测出字典序是怎么定义的:

  1. 一个数x,如果x*10 < n, 那么x后就是x*10
  2. 如果x*10 >= n, 那么x后接的就是x+1,这里需要注意的需要进位的情况,假如x=19,n= 21,它后面接的应该是2。

下面看看代码:

class Solution {
   
public:
    vector<int> lexicalOrder(int n) {
   
        vector<int> res;
        int cur = 1;
        for(int i=1; i<=n; i++){
   
            res.push_back(cur);
            if(cur * 10 <= n){
   
                cur *= 10;   
            }else{
   
                if(cur >= n){
   
                    cur /= 10;  
                }
                cur += 1;
                while(cur % 10 == 0){
   
                    cur /= 10;    // 对进位进行处理
                }
            }
        }
        return res;
    }
};

Leetcode 440:

题目链接: https://leetcode.com/problems/k-th-smallest-in-lexicographical-order/

1.题目描述:

输入正整数n, k,n >= k, 找出[1,n]范围内按照字典排序的最小第k个值。

输入描述:
输入两个正整数n,k

输出描述:
一个正整数

示例:
输入
15, 3

输出
11

2.题解:

题意:题意其实其实很明确,就是给你一个数n,输出字典序最小的第k个值;如果之前对字典序不是很熟悉的话,这道题会没什么思路,可以先做一下Leetcode 386,可以说是这道题的基础了。

做完386之后,就会有一个这样的想法,直接拿386的结果输出不就行了吗?事实证明那样做会超时。

可以当成10叉树来处理,先序遍历10叉树的结果就是字典序。但是这里可以借用这种思想,不用真正实现一个10叉树。

思路:

  1. 假如我们从cur节点开始遍历,其实我们只需知道从cur到cur+1节点之间经历了多少节点,如果经历的节点<=k, 那我们再从cur+1往后遍历,k= k-经历的节点。
  2. 如果经历的节点数>k, 说明第k个节点就在cur,cur+1之后,我们就把cur*10(cur的第一个子节点),继续往后遍历。
  3. 怎么计算cur到cur+1 之间经历的节点数量呢?假设n1=curn2=cur+1,n2总是n1最右子节点之后的右节点。
  4. 如果n2<=n,它们之间的节点数为n2 - n1, 如果n2>n,说明最大节点n在n1到n2之间,它们的节点数为n+1-n1;然后n110,n210往后遍历。

代码如下:

class Solution {
   
public:
    int findKthNumber(int n, int k) {
   
        long long cur = 1;
        k = k - 1;
        while(k > 0){
   
            
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值