2022.04.24 腾讯后台开发笔试&部分题解


1.竖着输出数字。
2.删除数组中下标非素数的数。
3.最大攻击和防守的差值。
4.循环链表链表序最小。
5.没看



1.竖着输出数字。

直接模拟。

#include <bits/stdc++.h>
using namespace std;


int main() {


    int n;
    cin >> n;
    vector<string>s(n);
    for(int i = 0; i < n; i++) cin >> s[i];
    vector<string>ans;
    for(int i = 0; i < s[0].size(); i++) {
        string t;
        for(int j = 0; j < n; j++) {
            t.push_back(s[j][i]);
        }
        string t2;
        int j = 0;
        while(j < t.size() && t[j] == '0') j++;
        if(j == t.size()) ans.emplace_back("0");
        else {
            t = t.substr(j, t.size() - j + 1);
            ans.emplace_back(t);
        }
    }
    sort(ans.begin(), ans.end(), [&](const string &x, const string &y) {
        if(x.size() == y.size()) return x < y;
        return x.size() < y.size();
    });
    for(int i = 0; i < ans.size(); i++) {
        cout << ans[i];
        if(i == ans.size() - 1) cout << '\n';
        else cout << ' ';
    } 


    return 0;
}



2.删除数组中下标非素数的数。

打表。
class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 
     * @param a int整型vector 
     * @return int整型
     */
    int getNumber(vector<int>& a) {
        int n = a.size();
        if(n <= 3) return a[n - 1];
        if(n == 4) return a[2];
        if(n <= 10) return a[4];
        if(n <= 30) return a[10];
        if(n <= 126) return a[30];
        if(n <= 708) return a[126];
        if(n <= 5380) return a[708];
        if(n <= 52710) return a[5380];
        return a[52710];
    }
};



3.最大攻击和防守的差值。

前后遍历。

#include <bits/stdc++.h>
using namespace std;



int main() {


    int n;
    cin >> n;
    string s;
    cin >> s;
    long long a = 0, b = 0;
    for(int i = 0; i < n; i++) {
        if(s[i] == '1') {
            b += i + 1;
        }
    }
    long long ans = LLONG_MAX;
    for(int i = 0; i < n; i++) {
        ans = min(ans, abs(a - b));
        if(s[i] == '0') {
            a += i + 1;
        } else {
            b -= i + 1;
        }
    }
    ans = min(ans, abs(a - b));
    cout << ans << endl;


    return 0;
}



4.循环链表链表序最小。

模拟。(把一个大于小于号写反了,浪费半小时,最后几分钟发现了,过了90%。。数组越界,没时间改了)

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * @param a ListNode类vector 指向每段碎片的开头
     * @return ListNode类
     */
    ListNode *solve(vector<ListNode *> &a) {
        unordered_map<int, ListNode *>mp;
        unordered_map<int, bool>vis;
        for(int i = 1; i < a.size(); i++) {
            mp[a[i]->val] = a[i];
        }
        vector<ListNode *>v;
        int minIndex = 0;
        ListNode *cur = a[0];
        while(cur) {
            v.push_back(cur);
            if(v[minIndex]->val > v.back()->val) {
                minIndex = v.size() - 1;
            }
            if(mp[cur->val] != nullptr) {
                auto t = mp[cur->val];
                mp[cur->val] = nullptr;
                cur = t;
            }
            vis[cur->val] = true;
            cur = cur->next;
            if(vis[cur->val]) break;
        }
        int nextIndex = minIndex + 1;
        int preIndex = minIndex - 1;
        if(nextIndex == v.size()) nextIndex = 0;
        if(preIndex == -1) preIndex = v.size() - 1;
        int step = 1;
        if(v[preIndex]->val < v[nextIndex]->val) step = -1;
        int curIndex = minIndex;
        int count = v.size() - 1;
        while(count--) {
            int nextIndex = curIndex + step;
            if(nextIndex == v.size()) nextIndex = 0;
            else if(nextIndex == -1) nextIndex = v.size() - 1;
            v[curIndex]->next = v[nextIndex];
            curIndex = nextIndex;
        }
        v[curIndex]->next = nullptr;
        return v[minIndex];
    }
};



5.没看

#腾讯笔试##实习##笔试题目##题解##腾讯#
全部评论
写了两道只有3有40%,凉凉咯
1 回复 分享
发布于 2022-04-24 22:17
哎,第三题没用long long卡了半天70
点赞 回复 分享
发布于 2022-04-24 22:32
这个表是用什么原理打的
点赞 回复 分享
发布于 2022-04-25 09:43

相关推荐

点赞 评论 收藏
分享
shtdbb_:还不错,没有让你做了笔试再挂你
点赞 评论 收藏
分享
点赞 5 评论
分享
牛客网
牛客企业服务