牛客网研究生机试题刷题记录

牛客网:清华大学

1.成绩排序
这题我一开始采用的是排序算法,排序最快的时间复杂度为O(nlogn)。所以这里换一种思路,既然有100分,不如建立一个二维vector,在每一份的vector上push上姓名,这样时间复杂度降到O(n)。

顺便复习一下排序的时间代价和分类。
排序的分类

时间代价表:
牛客网研究生机试题刷题记录_第1张图片

2.算约数的个数
思路很简答的算法题,但是容易用最简单的方法,导致超时。
这里记录一下思路:用一个i来进行循环,i < sqrt(n), 如果i 最后等于 sqrt(n) 其中包含i = 1这种特殊情况,需要给计数加一下。

#include
using namespace std;
int numOfDivisor(int num)
{
    int ans = 0;
    int i;
    for (i = 1; i*i<num; i++)
    {
        if (num%i == 0)
            ans += 2;
    }
    if (i*i == num) ans++;
    return ans;
}
int main()
{
    int n, num;
    while (cin >> n)
    {
        for (int i = 0; i<n; i++)
        {
            cin >> num;
            cout << numOfDivisor(num) << endl;
        }
    }
    return 0;
}

3.代理服务器
这里遇到了menset和fill,在这里写一下区别。

memset只能用来填充char型数组。
ill函数可以赋值任何,而且使用方法特别简便。

所以决定以后就用fill。头文件:。fill(arr, arr + n, 要填入的内容);

那这样只要贪心算法就好,每次选出能访问最多的服务器进行访问,不能访问完全时候flag为-1

4.翻转字符串
求string的实际长度 string.size()。
新创建的string默认长度为8字节。

5.逻辑题目,写出26个字母在每个按键上需要按几次,每个字母在哪个数字键盘上即可。

6.我先求了质数,然后如果一个质数可以被除,就一直除。此过程中摔了手机,幸好只是膜碎了。又下单买了三张。

7.整数拆分。

这题采用类似背包问题的解法。背包问题总结在另一篇文章。

这里跟完全背包问题有一些想通,但是不需要算权值,有方法就往上加,而且使用一维数组,要保证第一个是dp[1]是1。

牛客网:浙江大学

1.欧拉回路
欧拉回路的概念大概是:不令笔离开纸面,可画过图中每条边仅一次,且可以回到起点的一条回路。

我在网上找到了充要条件:除孤立节点外,其它节点满足 1.连通 2.度为偶数。

这里采用并查集的思想,把线路中给出的两个端点,都找出他们的“顶头大哥”,方便后续操作。如果所有的点的“顶头大哥”都是一个,这说明这就是个连通图。当然,这里还要考虑其中有孤立的点。

你可能感兴趣的:(数据结构)