滴滴2018秋招编程题

第一题:丑数

滴滴2018秋招编程题_第1张图片

解法一:暴力法,对于每一个数都要去判断是否是丑数,代码如下:

class Solution {
public:
    bool check(int n)
    {
        while (n % 2 == 0)
            n /= 2;
 
        while (n % 3 == 0)
            n /= 3;
 
        while (n % 5 == 0)
            n /= 5;
 
        return (n == 1) ? true : false;
    }
 
    int GetUglyNumber_Solution(int index) {
        if (index <= 0)
            return 0;
         
        int i = 0;
        int number = 0;
         
        while (i < index) {
            ++number;
            if (check(number)) {
                i++;
            }
        }
        return number;
    }
};

解法二:暴力法对于每一个数都去判断是否是丑数,其实没必要,可以直接求出所有的丑数,并把它们放在一个数组中,代码如下:

class Solution {
public:
    int GetUglyNumber_Solution(int index) {
        int *uglyNumber = new int[index];
        int *u2 = uglyNumber;
        int *u3 = uglyNumber;
        int *u5 = uglyNumber;
        int nextUglyNumber = 1;
        uglyNumber[0] = 1;
 
        while (nextUglyNumber < index) {
            int minUglyNumber = min(*u2 * 2, min(*u3 * 3, *u5 * 5));
            uglyNumber[nextUglyNumber] = minUglyNumber;
            while (*u2 * 2 <= uglyNumber[nextUglyNumber])
                u2++;
            while (*u3 * 3 <= uglyNumber[nextUglyNumber])
                u3++;
            while (*u5 * 5 <= uglyNumber[nextUglyNumber])
                u5++;
            nextUglyNumber++;
        }
        int ans = uglyNumber[index-1];
        delete []uglyNumber;
        return ans;
    }
};

解法三:和解法二一样也是直接求出所有的丑数,但是用队列来存储丑数,代码如下:

#include
#include
#include
using namespace std;

int main()
{
    queue q2,q3,q5;
    int n;
    int ans=1;
    int two, three, five;
    q2.push(2);
    q3.push(3);
    q5.push(5);
    cin>>n;
    n--;
    while(n--){
        two = q2.front();
        three = q3.front();
        five = q5.front();
        int mtmp= min(two, min(three, five));
        if(mtmp==two){
            q2.pop();
            q2.push(two*2);
            q3.push(two*3);
            q5.push(two*5);
        }else if(mtmp==three){
            q3.pop();
            q5.push(three*5);
            q3.push(three*3);
        }else{
            q5.pop();
            q5.push(five*5);
        }
        ans=mtmp;
    }
    cout<     return 0;
}

第二题:

滴滴2018秋招编程题_第2张图片

题意晦涩难懂,一个AC的代码如下:

#include
#include
#include
using namespace std;

int main()
{
    int cnt;
    vector vec;
    int begin = 0;
    int res=0;
    int flag = 0;

    while (cin >> cnt)
    {
        for (int i = 0; i < cnt; i++)
        {
            int tmp;
            cin >> tmp;
            vec.push_back(tmp);
        }
        begin = 0;
        res=0;
        for (int i = 0; i < cnt; i++)
        {
            if (vec[i] == 0)
            {
                res++;
                begin = i + 1;
                continue;
            }
            for (int j = begin; j < i; j++)
            {
                flag = 0;
                for (int k = j; k <= i; k++)
                {
                    flag ^= vec[k];
                }
                if (flag == 0)
                {
                    res++;
                    begin = i + 1;
                    continue;
                }
            }
        }
        cout << res << endl;
    }
    return 0;
}

你可能感兴趣的:(编程题)