2020年VIVO提前批笔试

注意:答题需要自己完善头文件和输入输出!
C++刷题和Leetcode不一样,多熟悉一下getline和cin这类的吧

第一题—种花问题

输入:
第一行读取一个数n,表示地的长度;
第二行读取一个长度为n的数组,元素为0 or 1,flowered[i] 表示该块地是否种有花;
输出:
最多能种的花的数量;
可参考Leetcode.605

思路:数组前后加一个0,从第二个元素开始遍历,遇到连续三个0就可以种花;

class Solution 
{
public:
    int canPlaceFlowers(vector<int>& flowerbed, int n) 
    {
        int count =  0;
        flowerbed.insert(flowerbed.begin(),0);
        flowerbed.insert(flowerbed.end(),0);
        for(int i = 1; i < flowerbed.size()-1; i++)
        {
            if(flowerbed[i] == 0 && flowerbed[i-1] == 0 && flowerbed[i+1] == 0)
            {
                flowerbed[i] = 1;
                count++;
            }
        }
        return count;
    }
};

第二题—鸡蛋掉落

你将获得 K 个鸡蛋,并可以使用一栋从 1 到 N 共有 N 层楼的建筑。
每个蛋的功能都是一样的,如果一个蛋碎了,你就不能再把它掉下去。
你知道存在楼层 F ,满足 0 <= F <= N 任何从高于 F 的楼层落下的鸡蛋都会碎,从 F 楼层或比它低的楼层落下的鸡蛋都不会破。
每次移动,你可以取一个鸡蛋(如果你有完整的鸡蛋)并把它从任一楼层 X 扔下(满足 1 <= X <= N)。
你的目标是确切地知道 F 的值是多少。
无论 F 的初始值如何,你确定 F 的值的最小移动次数是多少?

输入:
两个正整数 k 和 N;
输出:
1个正整数,表示能确切找到F时最少测试次数
可参考Leetcode.887

思路:
labuladong大佬思路详解
C++递归解法 代码贴在下面

class Solution {
public:
    int calcF(int K, int T)
    {
        if (T == 1 || K == 1) return T + 1;
        return calcF(K - 1, T - 1) + calcF(K, T - 1);
    }

    int superEggDrop(int K, int N)
    {
        int T = 1;
        while (calcF(K, T) < N + 1) T++;
        return T;
    }
};

附一个耗时最少的代码:

class Solution {
public:
    int superEggDrop(int K, int N) {
		vector<int> dp(K + 1);
		int res = 0;
		for (; dp[K] < N; ++res) {
			for (int i = K; i > 0; --i) {
				dp[i] = dp[i] + dp[i - 1] + 1;
			}
		}
		return res;
    }
};

第三题—合并n个有序数组

输入:
第一行由一个数字n组成,n<1000,代表n条流水线;
接下来有n行,每行由空格分割的一组数字组成,每个数组代表该流水线的工序编码;
较小编码全局有效,即数组升序排列;
工序编码全局有效,多个流水线上的相同编码始终代表同一工序;
输出:
合并后用工序编码描述完整流水线,用空格分隔;

合并排序数组(可参考Leetcode.88合并两个有序数组)

你可能感兴趣的:(2020年VIVO提前批笔试)