记一次大厂笔试

记第一次笔试

今天笔者参加了某大厂的笔试,第一题大致题目是这样的:

有一个整数n ( 1<=n<=1000000000),最多有n个人组成队列,并从中选取一位当队长,求共可以组成多少队伍(其中队长不同视为不同的队伍比如( 1(队长), 2 )和(1,2(队长)) )表示不同的两个队伍。输出最多有多少个队伍对1000000007取模;

示例

输入

2

输出

4

分析队伍数分别为

(1) (2) (1,2) (1,2)其中斜体表示队长

我刚开始是这样分析的

若n = 3 时,队伍数就是

1)(2)(3)(12)(12)(13)(13)(23)(23)(123)(123)(123

于是我得出了一个结论:

三个选一个队长的选择只有一种

三个选两个队长的选择有两种

三个选三个队长的选择有三种

总数也就是 = 三个选一个 * 1 + 三个选两个 * 2 + 三个选三个 * 3

也就是
C^1_3 + 2C^2_3 + 3C^3_3
那么得出通项公式
result = \sum_{i=1}^niC^i_n
问题就变成了求
C^i_n
因为
C^m_n = \frac{A^m_n} {m!} = \frac{n!}{m!(n - m)!} = C^{n-m}_n
接下来我开始研究阶乘,最后终于把代码写好了,开开心心的填上去一运行,通过了0%的测试用例,我打开了IDEA进行调试发现当你= 100 是 抛出了 by/zero 的异常,原来当n很大时整数溢出最后导致阶乘结果为0,我将int改成了long,BigDecimal 还是存在问题,后来我转换思路看看能不能举例找出通项

n = 1   result = 1
n = 2   result = 4
n = 3   result = 12
n = 4   result = 32
n = 5   result = 80
...

果不其然我找到了规律
result = n * 2^{n - 1}
这样问题转换成了求2^(n-1),我想起了位运算求2的幂次方,经过了一顿操作之后,我提交上去还是提示通过了0%的示例,同样当n足够大时还是溢出了。。。。不一会时间到了,我还没有来的及看第二题就结束了。

交卷之后我看了牛客网的帖子,有大牛说用快速幂就出来了,我去百度了一下什么是快速幂

https://blog.csdn.net/qq_40693171/article/details/84196079

首先要知道 (a * b)%c=(a%c)(b%c)*

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        // TODO 自动生成的方法存根
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();
        for (int i = 0; i < t; i++) {
            long b = sc.nextLong();
            long c = 1000000007;
            long a = 2;
            long res = 1;
            a %= c;
            for (; b != 0; b /= 2) {
                if (b % 2 == 1)
                    res = (res * a) % c;
                a = (a * a) % c;
            }
            System.out.println(res);
        }
    }
}

后来我套了模板

import java.util.Scanner;

public class Alibaba {


    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int x = in.nextInt();
        System.out.println(fun2(x));
    }

    final static int M=1000000007;
    private static long fun1(int n){
        if(n==0) return 1;
        if(n==1) return 2;
        long ans=1;
        long base=2;
        while(n!=0){
            if((n&1)==1) ans=((ans%M)*(base%M))%M;
            base=((base%M)*(base%M))%M;
            n>>=1;
        }
        return ans%M;
    }
    //n*2^(n-1) % 1000000007
    private static int fun2(int n){
        return (int) (((n%M)*(fun1(n-1)%M))%M);
    }
}

调试未发现问题

通过这次笔试真的发现了自己与其他人差距甚大

coding everyday,everyday coding

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 9,043评论 0 2
  • One 1 the [ðə, ði:] art.这,那 ad.[用于比较级;最高级前] 2 be [bi:,bi]...
    梁培林阅读 13,133评论 0 10
  • 前几天刚陪爸妈去电影院看了《神秘巨星》,不得不说阿米尔汗的催泪功夫实在了得,全场观众的抽泣声此起彼伏。阿米尔汗继《...
    忆言如晤阅读 3,142评论 0 2
  • 王小姐芳龄28了,被相亲很久了。 这个对象她妈妈催她见面好几次了,她都不愿意。 最近有一个大活动,王小姐和母亲一起...
    朝颜阅读 3,514评论 2 4
  • 无记录不发生,非常感谢金凤老师的组织,我们在特别舒适的“博览书店”聚会,与伙伴们相聚在这里,畅所欲言,收获满满,期...
    美妆博主樱子阅读 3,038评论 0 1

友情链接更多精彩内容