滴滴笔试

1.把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。

思路1:最简单的思路,从1到大数,每个数都检测一遍是否是丑数。一个数一个数的判断,如果能被2整除,就一直除以2,如果能被3整除,就一直除以3,如果能被5整除,就一直除以5。如果最后的商为1,则说明为丑数。

static boolean isUgly(long m){
        while(m%2==0){
            m/=2;
        }
        while(m%3==0){
            m/=3;
        }
        while(m%5==0){
            m/=5;
        }
        return m==1?true:false;
    }

思路2:思路1的时间复杂度很高,因为每一个数都要判断(不是丑数的也要进行运算)。现在考虑以空间换时间,注意到:一个丑数的2、3、5倍也一定是丑数,而1是丑数,所以可以根据1来推出所有的丑数。

先用1乘以2、3、5,所得的数中的最小值作为第二个丑数,再用1、2分别乘以2、3、5,所得的数中的最小值作为第三个丑数。以此内推。

package com.bili.hello;
import java.util.*;
public class Main{
    public static void main(String[] args){
       System.out.println(GetUglyNumber(14));
    }
    public static int GetUglyNumber(int index)
    {
        //边界判断
        if (index <= 0)
        {
            return 0;
        }
        //定义一个数组用于存放丑数
        int[] uglyNumbers = new int[index];
        uglyNumbers[0] = 1;
        int nextUglyIndex = 1;
        int multiply2 = 0;
        int multiply3 = 0;
        int multiply5 = 0;
        int min = 0;

        while (nextUglyIndex < index)
        {
            min = Min(uglyNumbers[multiply2] * 2, uglyNumbers[multiply3] * 3, uglyNumbers[multiply5] * 5);
            uglyNumbers[nextUglyIndex] = min;
            while (uglyNumbers[multiply2] * 2 <= uglyNumbers[nextUglyIndex])
            {
                multiply2++;
            }
            while (uglyNumbers[multiply3] * 3 <= uglyNumbers[nextUglyIndex])
            {
                multiply3++;
            }
            while (uglyNumbers[multiply5] * 5 <= uglyNumbers[nextUglyIndex])
            {
                multiply5++;
            }
            nextUglyIndex++;
        }

        int result = uglyNumbers[index - 1];
        uglyNumbers = null;
        return result;
    }

    private static int Min(int num1, int num2, int num3)
    {
        //比较三个数中的最小数
        int min = num1 < num2 ? num1 : num2;
        min = min < num3 ? min : num3;
        return min;
    }
}
时间: 2024-10-14 16:21:32

滴滴笔试的相关文章

【滴滴笔试】1.连续数组的最大和 2.找出数组中第K大的数

1 import java.util.Arrays; 2 import java.util.Scanner; 3 public class Main { 4 public static void main(String args[]){ 5 Scanner scanner = new Scanner(System.in); 6 while (scanner.hasNext()){ 7 String str = scanner.nextLine(); 8 String[] arrStr = str

我的校招季大概也是结束了。

其实,不知道该写什么.这些天,腾讯的offer让我有些飘飘然,让我有些晕乎乎,我有的时候很看得起自己,有的时候又很看不起自己. 说到底,我觉得自己只是比别人执拗一点,坚持一点. 论聪明,我绝对是一般的才智,比下有余,比上不足.我有一些小聪明,思维转动比一些人快,常常能想到很多方面,却不集中. 论代码功底,我更是不如很多代码大牛.常常有人问我,写过的代码有多少行,我没敢说,我知道,不多.这也是我的劣势之一,以后无论是在学习还是工作中,都要以此为奋斗目标之一. 论算法,看到dp和递归的一些思路,我经

滴滴出行2015在线笔试题目

最大子矩阵 题目:求一个矩阵中最大2*2矩阵(元素和最大)的和. 如: 1 2 3 0 4 2 3 4 5 1 1 1 5 3 0 中最大的是 4 5 5 3 和为17 输入:m*n的矩阵 输出:该m*n矩阵的最大2*2子矩阵的和. 例如输入: 1 2 0 3 4 : 2 3 4 5 1: 1 1 5 3 0 输出: 17 分析:这道题目是一道OJ的题目,原题是求最大子矩阵的和,题目里子矩阵是随意的,没有2*2的限制.这里2*2子矩阵是将问题简化了.最蛋疼的是,问题的输入格式太奇葩,大部分时间都

滴滴出行2017春招运维岗笔试真题汇总

1.当前云计算技术发展迅速,主流云计算平台大多数都以Linux为基础.请问以下哪个技术是Linux内核提供的可以限制.记录.隔离进程组所使用的物理资源(如:cpu,memory,IO等等)的机制正确答案: B A KVMB cgroupC cgroupD namespace 2.某IP地址为160.55.115.24/20,它的子网划分出来的网络ID地址?正确答案: A A 160.55.112.0B 160.55.115.0C 160.55.112.24D 其他答案都不对 3.TCP协议在建立

为何滴滴会走Uber之路,研发无人驾驶?

近日,滴滴出行宣布完成新一轮超过55亿美元融资,以支持其全球化战略的推进和前沿技术领域的投资.其中,无人驾驶汽车将是这笔资金重要的投资方向.此前,滴滴在全球范围内的追赶对象Uber不断在无人汽车领域发力,滴滴此举,是否是要加强自身在出行行业的话语权和主动权?再加上特斯拉.谷歌.福特等不断在无人驾驶上做文章,立志做下一个巨鳄的滴滴,自然不会放过这个大热风口. 消除司机边界成本滴滴野心显露 原本网约车条例的出台,让共享打车企业都松了一口气--总算被承认了.但是在各地具体实施以来,却让共享打车企业遭遇

DP - tencent2016实习生笔试A

tencent2016实习生笔试A Problem's Link ---------------------------------------------------------------------------- Mean: 给定一个字符串s,你可以从中删除一些字符,使得剩下的串是一个回文串.如何删除才能使得回文串最长呢?输出需要删除的字符个数. analyse: 对于这题来说,插入字符和删除字符使其成为回文串,答案是一样的. 首先求s的反串rs,然后对s和rs求最长公共子序列,要删除的字

算法学习 并查集(笔试题目:找同伙)

题目背景太长,记得不清楚,暂参考<啊哈算法>一书,根据笔试题目大意改编如下: 警察正要捉获某地区的犯罪团伙,由于强盗人数过大,想查清楚有几个团伙非常困难. 根据上级指示,需要首先尽快抓获强盗A所在的团伙,这需要掌握 1 所在团伙的人数.先有资料如下: 强盗1 和 强盗2 是同伙 强盗3 和 强盗4 是同伙 强盗2 和 强盗5 是同伙 强盗3 和 强盗2 是同伙 注意,强盗的同伙的同伙也是同伙,问  强盗1 的同伙(不包括1自己)有多少人? 该题形式化表示如下: 每个测试实例首先包括2个整数:N

2015腾讯笔试大题

今天做完腾讯的在线笔试,感觉自己弱爆了,选择题部分考得比较基础,但是考的面比较广,数据结构,计算机网络,算法常识,概率题,C,C++,都有.大题如下: 在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code).请编写一个函数,使用递归方法生成N位的格雷码,并且保证这个函数的健壮性. 2. 有下图的题解,请用C/C++代码来列出满足下图0-100内的所有答案. 3. 如图所示,系统中有三个进程Producer,Transmitter和Consumer.

腾讯、网易有道和阿里的笔试分享及自我总结

声明:本人Android移动开发岗 腾讯:考的很杂 选择题(25题不定项):考的包括: 编译原理两题, 计算机网络一两题(私网地址), C++若干, IOS开发一两题, 还有二叉树两三题,先后序遍历,求深度 jvm也有一题, 概率论一两题, JavaScript一题, 还有C语言(包括指针数组,数组指针,指针函数之类的)也挺多的 更多的是看程序求输出. 大题: 1,10亿QQ号用Set和Vector两个容器来删除奇数号 2,猴子摘香蕉,一次可以摘一根或两根,求摘50根有几种摘法(斐波那契数列)