java - 算法 - 腾讯2018春招

1.小Q定义了一种数列称为翻转数列:
给定整数n和m, 满足n能被2m整除。对于一串连续递增整数数列1, 2, 3, 4..., 每隔m个符号翻转一次, 最初符号为‘-‘;。
例如n = 8, m = 2, 数列就是: -1, -2, +3, +4, -5, -6, +7, +8.
而n = 4, m = 1, 数列就是: -1, +2, -3, + 4.
小Q现在希望你能帮他算算前n项和为多少。

输入描述:
输入包括两个整数n和m(2 <= n <= 109, 1 <= m), 并且满足n能被2m整除。
输出描述:
输出一个整数, 表示前n项和。
输入例子1:
8 2
输出例子1:
8
package tx;

import java.math.BigInteger;
import java.util.*;
public class q1{
    public static void main(String[] args){

        Scanner s = new Scanner(System.in);

        String str = s.nextLine();
        String[] strArr = str.split(" ");
        BigInteger n = new BigInteger(strArr[0]);
        BigInteger m = new BigInteger(strArr[1]);

        BigInteger sum = m.multiply(n).divide(new BigInteger("2"));

        System.out.println(sum);

    }
}

题本身不难- - 用初中数学只是就能得出结果是 m*n/2

主要是用到了bigInteger处理大数字。

2.

牛牛和羊羊正在玩一个纸牌游戏。这个游戏一共有n张纸牌, 第i张纸牌上写着数字ai。
牛牛和羊羊轮流抽牌, 牛牛先抽, 每次抽牌他们可以从纸牌堆中任意选择一张抽出, 直到纸牌被抽完。
他们的得分等于他们抽到的纸牌数字总和。
现在假设牛牛和羊羊都采用最优策略, 请你计算出游戏结束后牛牛得分减去羊羊得分等于多少。

输入描述:
输入包括两行。第一行包括一个正整数n(1 <= n <= 105),表示纸牌的数量。第二行包括n个正整数ai(1 <= ai <= 109),表示每张纸牌上的数字。
输出描述:
输出一个整数, 表示游戏结束后牛牛得分减去羊羊得分等于多少。
输入例子1:
3
2 7 4
输出例子1:
5
package tx;

import java.util.*;
public class q2{
    public static void main(String[] args){

        Scanner s = new Scanner(System.in);

        String str1 = s.nextLine();

        int num = Integer.parseInt(str1);

        String str2 = s.nextLine();
        String[] strArr = str2.split(" ");
        int[] iArr = new int[num];

        for(int i = 0; i < num; i++) {
            iArr[i] = Integer.parseInt(strArr[i]);
        }

        sort(iArr, 0, num - 1);

        int sum = 0;
        for(int i = 0; i < num; i++){
            if(i % 2 == 0){
                sum = sum + iArr[i];
            }
            else{
                sum = sum - iArr[i];
            }
            //System.out.println(iArr[i]);
        }

        System.out.println(sum);

    }

    public static void sort( int[] iArr, int start, int end){ //冒泡排序会超时,采用快速排序
        if(start > end){
            return;
        }

        int base = start;
        int low = start;
        int high = end;

        while(low < high){
            while(low < end && iArr[low] >= iArr[base]){
                low++;
            }
            while(high > start && iArr[high] <= iArr[base]){
                high--;
            }
            if(low > high){

                break;
            }
            else{
                int temp = iArr[high];
                iArr[high] = iArr[low];
                iArr[low] = temp;
            }
        }

        int temp = iArr[high];
        iArr[high] = iArr[base];
        iArr[base] = temp;

        sort(iArr, start, high - 1);
        sort(iArr, high + 1, end);

    }

}

考察了排序,先排序后遍历做加减法就行。

而且由于有运行时间限制,所以用快速排序,冒泡排序等时间复杂度是O²的会超时。

3.小Q的父母要出差N天,走之前给小Q留下了M块巧克力。小Q决定每天吃的巧克力数量不少于前一天吃的一半,但是他又不想在父母回来之前的某一天没有巧克力吃,请问他第一天最多能吃多少块巧克力

输入描述:
每个输入包含一个测试用例。每个测试用例的第一行包含两个正整数,表示父母出差的天数N(N<=50000)和巧克力的数量M(N<=M<=100000)。
输出描述:
输出一个数表示小Q第一天最多能吃多少块巧克力。
输入例子1:
3 7
输出例子1:
4
package tx;
import java.util.*;
public class q3{
    public static void main(String[] args){

        Scanner s = new Scanner(System.in);

        int n = s.nextInt(); //天数
        int m = s.nextInt(); //巧克力数量

        //二分法查找第一天的最大巧克力数量
        int start = 0;
        int end = m;

        while(start < end){

            int sweetNum = (end + start) / 2;

            if(isEnough(n, m, sweetNum)){

                //System.out.println(sweetNum + "够了");
                start = sweetNum + 1;

            }
            else{
                end = sweetNum;
            }
        }

        if(n == 1) {  //n = 1时二分查找会有问题,所以单独拿出来。
            System.out.println(m);
        }
        else {
            System.out.println(end - 1);
        }

    }

    public static boolean isEnough(int n , int m, int sweetNum){  //判断 sweet在n天内能否够吃

        for(int i = 0; i < n ; i++) {
            m = m - sweetNum;
            sweetNum = (int)Math.ceil(sweetNum * 1.0 / 2);
        }

        if(m >= 0){
            return true;
        }
        else{
            return false;
        }

    }

}

本质:从m个顺序排列的数字中(1 - m)寻找符合要求的最大值。

用遍历会超时,用二分查找,寻找符合要求的最大值。

4.小Q有X首长度为A的不同的歌和Y首长度为B的不同的歌,现在小Q想用这些歌组成一个总长度正好为K的歌单,每首歌最多只能在歌单中出现一次,在不考虑歌单内歌曲的先后顺序的情况下,请问有多少种组成歌单的方法。

输入描述:
每个输入包含一个测试用例。每个测试用例的第一行包含一个整数,表示歌单的总长度K(1<=K<=1000)。接下来的一行包含四个正整数,分别表示歌的第一种长度A(A<=10)和数量X(X<=100)以及歌的第二种长度B(B<=10)和数量Y(Y<=100)。保证A不等于B。
输出描述:
输出一个整数,表示组成歌单的方法取模。因为答案可能会很大,输出对1000000007取模的结果。
输入例子1:
5
2 3 3 3
输出例子1:
9
package tx;

import java.math.BigInteger;
import java.util.*;
public class q4{
    public static void main(String[] args){

        Scanner s = new Scanner(System.in);

        int k = Integer.parseInt(s.nextLine()); //天数
        String str = s.nextLine(); //巧克力数量
        String[] steArr = str.split(" ");

        int a = Integer.parseInt(steArr[0]); //长度
        int x = Integer.parseInt(steArr[1]); //数量
        int b = Integer.parseInt(steArr[2]);
        int y = Integer.parseInt(steArr[3]);

        //求出两种歌的个数有多少种组合。

        ArrayList<Integer> aa = new ArrayList();
        ArrayList<Integer> bb = new ArrayList();

        for(int i = 0; i <= x; i++){
            int r = k - a * i;
            if(r % b == 0 && r/b <= y){
                aa.add(i);
                bb.add(r/b);
            }
        }

        BigInteger bi = new BigInteger("0");
        for(int i = 0; i < aa.size(); i++){
            BigInteger temp = getC(aa.get(i), x);
            temp = temp.multiply(getC(bb.get(i), y));
            bi = bi.add(temp);
        }
        bi = bi.mod(new BigInteger("1000000007"));
        System.out.println(bi);

    }

    public static BigInteger getC(int x, int y){
        if (x == 0) {
            return new BigInteger("1");
        }

        BigInteger bi = new BigInteger("1");
        for(int i = 1; i <= y; i++){
            bi = bi.multiply(new BigInteger("" + i));
        }
        for(int i = 1; i <= x; i++){
            bi = bi.divide(new BigInteger("" + i));
        }
        for(int i = 1; i <= ( y - x); i++){
            bi = bi.divide(new BigInteger("" + i));
        }
        bi = bi.mod(new BigInteger("1000000007"));
        return bi;
    }

}

我是先求出x 和 y的数量上的组合种类,然后对每种情况分别求x和y的 C(n,m)的乘积, 然后结果相加

比如例题中只有一种情况:x取1个,y取1个

c(1,3) * c(1,3) = 9

x从3个中取1个,y也是从3个中取1个,总共有9中不同取法。

c(n,m)   : 不考虑顺序的情况下,从m个物品中抽出n个有多少种排列组合

数学公式:C(n,m)=n! / ( m! * (n-m)! )

还有2个- -明天再做。。。

原文地址:https://www.cnblogs.com/clamp7724/p/12111007.html

时间: 2024-09-30 07:05:31

java - 算法 - 腾讯2018春招的相关文章

腾讯2015春招pc客户端开发练习卷

1.下列说法错误的有() A.  在类方法中可用this来调用本类的类方法 B. 在类方法中调用本类的类方法时可直接调用 C. 在类方法中只能调用本类中的类方法 D.  在类方法中绝对不能调用实例方法 答案:ACD A 首先要清楚,类方法指的是,用static修饰的静态方法,众所周知,静态方法是不包含this指针的,因为它不属于某一个具体的对象所有 C 类方法可以不必实例化而直接调用,所以,类方法可以调用其他类的类方法 D (参考别人的,我也觉得说的很有道理)可以在类方法中先实例化对象,然后调用

2018春招-今日头条笔试题-第三题(python)

题目描述:2018春招-今日头条笔试题5题(后附大佬答案-c++版) 解题思路: 本题的做法最重要的应该是如何拼出'1234567890',对于输入表达试获得对应的结果利用python内置函数eval()即可以实现.利用5个字符串来表达'1234567890',如下(为了好看,里面加了tab空格符) '66666 ....6 66666 66666 6...6 66666 66666 66666 66666 66666''6...6 ....6 ....6 ....6 6...6 6.... 6

腾讯2016春招之算法编程解析

第一道题:求有删除情况的最长回文子串 题目: 解题思路: 这个题严格意义上来说,删除了字符就谈不上回文串了,既然有删除,那估计考察的不是回文串,而是其他的,但是这个东西又有回文串的特点,细想一下——那就是不连续的回文串,想到不连续,就容易使人想到最长公共子序列,把源字符串逆序之后对比两个字符串发现:我靠,这不就是求两个序列的最长公共子序列(好像跟回文串没多大关系). 考察:回文串,动态规划,知识迁移 1 #define M 100 2 int dpLCS[M][M]; //设置成全局变量,自动初

2018春招 快手一面(详细数据类型分析)

快手一面给的感觉特别好   面试官人很nice  错的地方都会给讲解  可能跟他之前让我等了40分钟有关吧嘻嘻嘻 没让我自我介绍  自己自我介绍了了一波   调设备调了很久 1.css相关    给你一个定宽定高的弹层  如何实现水平垂直居中 第一种方法是使用position:absolute  设置margin-left和margin-top   或者left top 第二 display:table   display:table-cell(并不能) 自动换行:word-break:brea

腾讯笔试题——腾讯2015春招pc客户端开发练习卷

1. C++题目 静态成员函数(类方法) 下列说法错误的有( ) 正确答案: A C D   你的答案: C D (错误) 在类方法中可用this来调用本类的类方法 在类方法中调用本类的类方法时可直接调用 在类方法中只能调用本类中的类方法 在类方法中绝对不能调用实例方法 解析: 成员方法又称为实例方法 静态方法又称为类方法 其次: a,静态方法中没有this指针 c,可以通过类名作用域的方式调用Class::fun(); d,太绝对化了,在类中申请一个类对象或者参数传递一个对象或者指针都可以调用

试卷: 腾讯2015春招web前端开发练习卷

1  jquery ajax中都支持哪些返回类型? dataType (default: Intelligent Guess (xml, json, script, or html)) Type: String The type of data that you're expecting back from the server. If none is specified, jQuery will try to infer it based on the MIME type of the res

腾讯 2018 秋招精选(50 题)

AC # 题名 难度   2 两数相加  中等   4 两个排序数组的中位数  困难   5 最长回文子串  中等   7 反转整数  简单   8 字符串转整数  中等   9 回文数   简单   11 盛最多水的容器  中等   14 最长公共前缀  简单   15 三数之和   中等   16 最接近的三数之和  中等   20 有效的括号  简单   21 合并两个有序链表  简单   23 合并k个有链表  困难   26 删除排序数组中的重复项   简单   33 搜索旋转排序数组

[找工作] 2019秋招|从春招到秋招,Java岗经验总结(收获AT)

转自(有更多) https://blog.csdn.net/zj15527620802/article/month/2018/10 前言 找工作是一件辛酸而又难忘的历程.经历过焦虑.等待.希望,我们最终都能去到属于自己理想的地方. 从春招到秋招,我总计面试了数十家公司.春招面试了腾讯.去哪儿.360.小米.携程.华为.今日头条.美团.菜鸟网络等9家公司.除了今日头条止步三面.菜鸟物流备胎至七月底才回绝,其他公司均通过了面试.最后在美团和腾讯中纠结了一段时间后,选择了腾讯去实习.秋招腾讯转正的还算

Java三月春招面试经历分享(没offer不是我的锅)

三月春招眼看就已经过半了,还没有找到自己心仪工作的Java开发者小伙伴,这里给大家分享一下最近去某个大家都很想去的大厂的面试经历,希望对大家跳槽找工作有帮助~ 1.说出你印象最深刻的项目? 从你担任的角色,以及你在项目中遇到的问题,如何解决,还有就是项目有哪些比较特色的闪光点! 2.你觉得90后身上具备什么素质和能力? ①:交际能力.适应环境能力.技术能力.自省能力.自控能力.意志力 ②:自尊.自立.不要好高骛远 ③:我们要想成就一件事情,如果没有较坚强的意志力是什么也干不成的.即使是你有过人的