笔试题

搜狗2017年校招笔试编程题题目:

在一个圆形上的若干点,点的位置以角度的形式表示,(0-360),输入若干的点的位置,点的距离以劣弧对应角度表示,求距离最远的两个点的角度多大?(输入的数据是从小到大的顺序)
自己写的正确率不是100%
有个同学分享了复杂度O(n)的解法

void farest() {
    int n;
    cin >> n;
    double* angle = new double[n];
    for (int i = 0; i < n; i++) {
        cin >> angle[i];
    }
    double result = 0;
    if (angle[n - 1] - angle[0] <= 180)
        result = angle[n - 1] - angle[0];
    else{
        int l = 0, r = 1;   
        while (l < r) {
            while (r < n&&angle[r] - angle[l] <= 180)//r右移,找到第一个相差大于180的位置
                ++r;
            if (l < r)
                result = max(result, angle[r - 1] - angle[l]);//更新此时的最大角度差
            //l左移,找到第一个相差小于180的位置
            while (l < r&&l < n&&angle[r] - angle[l]>=180)
                ++l;
            if (l > 0 && r < n)
                result = max(result, 360-(angle[r] - angle[l-1]));
        }
    }
    cout << fixed << setprecision(8) << result << endl;
}

迅雷2017年校招笔试编程题:

字符串问题:
输入:1->2->3->4->5
输出:2->1->4->3->5
输入:1->2->3->4
输出:2->1->4->3
注意:数字是int类型
因为Python有split函数,所以我就直接用啦

def reverseStr():
    s = raw_input()
    numbers = map(int,s.split("->"))
    for i in range(1,len(numbers),2):
        numbers[i],numbers[i-1]=numbers[i-1],numbers[i]
    return "->".join(str(i) for i in numbers)

C++,用了之前自己编写split函数

vector<string> splitString(const string& s, const string& c) {
    vector<string> v;
    int start = 0;
    int end = s.find(c);
    while (string::npos != end) {
        v.push_back(s.substr(start, end-start));
        start = end + c.size();
        end = s.find(c,start);
    }
    if (start != s.length())
        v.push_back(s.substr(start));
    return v;
}
void reverseStr() {
    string s;
    cin >> s;
    if (s.size() < 4)
        cout << s << endl;
    string c = "->";
    vector<string> vs = splitString(s, c);
    string res = "";
    for (int i = 0; i < vs.size(); i += 2) {
        if (i + 1 < vs.size()) {
            res += vs[i + 1] + c + vs[i];
            if (i + 1 < vs.size() - 1)
                res += c;
        }
        else
            res += vs[i];
    }
    cout << res << endl;
}

百度2017年校招笔试编程题:

选择题 30道 自然语言处理、数据结构。。
问答题 1道 自然语言处理 不会
设计题 1道 推荐手机品牌 设计推荐系统 照着专利写了
编程题:
1)字符串处理
“W” “E”构成的字符串,W代表西边的房子,E代表东边的房子,字符串划分成部分,要求分错边的房子数最少
动态规划
dp[i]=dp[i-1]-1 s[i]==’W’
dp[i]=dp[i-1]+1s[i]==’E’

void splitHouse() {
    string s;
    cin >> s;
    int W = 0;
    int E = 0;
    for (int i = 0; i < s.size(); i++) {
        if (s[i] == 'W')
            ++W;
        if (s[i] == 'E')
            ++E;
    }
    int* dp = new int[s.size()+1]();
    dp[0] = W;
    dp[s.size()] = E;
    int minC = W < E ? W : E;

    for (int i = 1; i <= s.size(); i++) {
        if (s[i - 1] == 'W')
            dp[i] = dp[i - 1] - 1;
        if (s[i - 1] == 'E')
            dp[i] = dp[i - 1] + 1;
        minC = minC < dp[i] ? minC : dp[i];
    }
    cout << minC << endl;
}

2)连分数
输入两个字符串表示连分数X,Y。判断X,Y的大小关系。
只过了80%应该是浮点数的问题。

double continuedfraction2fraction(string& s)
{
    int i = 1;
    vector<int> a;

    while (i<s.size()) {
        if (isdigit(s[i])) {
            int v = 0;
            while (isdigit(s[i])) {
                v *= 10;
                v += s[i] - '0';
                i++;
            }
            a.push_back(v);
        }
        else
            i++;
    }

    if (a.size() == 1)
        return a[0];
    else {
        int n, d;

        n = a.back();
        d = 1;
        a.pop_back();
        while (a.size() != 0) {
            swap(n, d);

            n = a.back() * d + n;
            a.pop_back();
        }
        //cout << d << " " << n << endl;
        return double(d) / n;
    }
}


void compareTwo() {
    string A, B;
    //cin >> A;
    //cin >> B;
    getline(cin, A);
    getline(cin, B);
    double v1 = continuedfraction2fraction(A);
    double v2 = continuedfraction2fraction(B);
    if (v1 < v2)
        cout << ">" << endl;
    else
        cout << "<" << endl;
}

2018平安科技校园招聘

5道编程题
(1)翻转数字相加
输入: 123 456
输出:975

void reverseNumAdd(){
    string a;
    string b;
    cin>>a>>breverse(a.begin(),a.end());
    reverse(b.begin(),b.end());
    cout<<atoi(a)+atoi(b)<<endl;
} 

(2)largest rectangle in histogram 直方图中最大的矩形面积(leetcode原题)
leetcode 84. Largest Rectangle in Histogram
(3)还是leetcode原题
leetcode 127. Word Ladder
(4)求一个无序数组中最小的k个数,保持原有顺序输出
算是剑指offer原题吧,要求尽量O(n)的复杂度

(5)顺时针打印矩阵元素
剑指offer原题,看这里

360校园招聘

很坑啊,选择题30道几乎全是给一段程序求输出结果,字太小,没有缩进,看到崩溃,而且涵盖了C++,java,shell,python各种语言。。。
编程题三道,只来得及做出一道,第二题没写完orz
(1)游乐园问题
一张游乐园的票可以玩t分钟,给一个数组表示n个项目,ai代表第i个项目的时间,求最长可以玩多久。
四舍五入是个0-1背包问题。
除了时间最长的那个项目,共n-1个项目,总时间t-1来求解最优值。
剩余的最后一分钟去玩最长时间的项目。

void playTime() {
    int t, n;
    cin >> n >> t;
    int* time = new int[n]();
    for (int i = 0; i < n; i++)
        cin >> time[i];
    sort(time, time + n);
    vector<vector<int>> dp(n, vector<int>(t, 0));
    for (int i = 1; i < n; i++) {
        for (int j = 1; j <t; j++) {
            if (time[i-1] > j)
                dp[i][j] = dp[i - 1][j];
            else {
                if (dp[i - 1][j - time[i-1]] + time[i-1] > dp[i - 1][j])
                    dp[i][j] = dp[i - 1][j - time[i-1]] + time[i-1];
                else
                    dp[i][j] = dp[i - 1][j];
            }
        }
    }
    cout << dp[n-1][t-1]+time[n-1] << endl;
}

(2)障碍的个数
小明玩一个游戏,如果连续三个障碍物的高度是非递减序列,那么视为一个障碍。
给一个数组A[n],n比较大。
一共m个查询,[l,r],要你给出[l,r]间有多少个障碍。m也比较大。

每次查询都去计算一遍是不可行的。
所以我设想的方案是:
首先遍历A数组,找出所有的非递减序列,并存储左右边界
对于m中每个查询L,R,在存储的非递减序列总判断是否有交集,然后障碍个数=交集非递减序列长度-2
大致长这样吧,没得测试了

void queryP() {
    int n;
    scanf("%d", &n);
    int* high = new int[n]();
    for (int i = 0; i < n; i++)
        scanf("%d", high[i]);
    int m;
    scanf("%d", &m);
    int** que = new int*[m];
    for (int i = 0; i < m; i++)
        que[i] = new int[2]();
    for (int i = 0; i < m; i++)
        scanf("%d %d", que[m][0],que[m][1]);
    vector<int>left;
    vector<int>right;
    int l = 0, r = 0;
    int i = 0;
    while(i<n-2) {
        if (high[i] <= high[i + 1])
            ++r;
        else {
            left.push_back(l);
            right.push_back(r);
            l = i + 1;
        }
        ++i;
    }
    int len = left.size();
    for (int i = 0; i < m; i++) {
        int count = 0;
        for (int j = 0; j < len; j++) {
            int l = max(que[i][0], left[j]);
            int r = min(que[i][1], right[j]);
            if (r - l > 2)
                count += r - l;             
        }
        cout << count << endl;
    }
}

(3)大约是个最短路径问题,没细看

测评 60分钟专业知识
数据结构选择题 3道编程
1)数组第二大的数
一轮比较就可以了

int find_sec_max(int data[], int count) {
    if (count < 2)//数组长度小于2,不存在第2大的
        return -1;
    int first = INT_MIN, second = INT_MIN;
    for (int i = 0; i < count; i++) {
        if (data[i] > first) {
            second = first;
            first = data[i];
        }
        else if (data[i] > second&&data[i] < first)
            second = data[i];
    }
    cout << second << endl;
    return second;
}

2)求阶乘,递归
不知道考点在哪里??
3)把数组排成最小的数
剑指offer原题
正式笔试

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值