字节笔试9.18后端

自己简单记录一下
1.堆金字塔,用二分优化了一下,AC
#include <iostream>
#include <vector>
#include <set>
using namespace std;
vector<double> v;
int main() {
    int n, m, ret = 0;
    double x;
    scanf("%d%d", &n, &m);
    for(int i = 0; i < m; ++i) {
        scanf("%lf", &x);
        v.push_back(x);
    }
    ret += m;
    for(int i = 1; i < n; ++i) {
        scanf("%d", &m);
        vector<double> t;
        for(int j = 0; j < m; ++j) {
            scanf("%lf", &x);
            int f = 0, cnt = 0, l = 0, r = v.size() - 1;
            set<int> s;
            while(l <= r) {
                int mid = l + r >> 1;
                if(v[mid] > x - 50 && v[mid] < x + 50) {
                    f = 1; break;
                }
                if(v[mid] > x - 100 && v[mid] < x + 100) {
                    s.insert(mid);
                    l++;
                } 
                else if(v[mid] <= x - 100) l = mid + 1;
                else r = mid - 1;
            }
            l = 0, r = v.size() - 1;
            while(l <= r) {
                int mid = l + r >> 1;
                if(v[mid] > x - 50 && v[mid] < x + 50) {
                    f = 1; break;
                }
                if(v[mid] > x - 100 && v[mid] < x + 100) {
                    s.insert(mid);
                    r--;
                } 
                else if(v[mid] <= x - 100) l = mid + 1;
                else r = mid - 1;
            }
            if(f || s.size() > 1) {
                ret++;
                t.push_back(x);
            }
        }
        v = t;
    }
    printf("%d", ret);
}


2.神奇序列,AC
#include <iostream>
using namespace std;
int main() {
    string s;
    cin >> s;
    int len = 1, ans = 0;
    for(int i = 1; i < s.length(); ++i) {
        if(s[i] == s[i - 1]) {
            len = 1;
        } else {
            len++;
            if(len > 2)
                ans = max(ans, len);
        }
    }
    cout << ans;
}


3.ASDF,滑动窗口划过去,有个样例没过,但一交AC了
#include <iostream>
#include <vector>
#include <map>
using namespace std;
map<char, int> m, m1;
vector<char> v;
int main() {
    string s;
    cin >> s;
    for(int i = 0; i < s.length(); ++i)
        m[s[i]]++;
    int cnt = s.length() / 4;
    for(auto it = m.begin(); it != m.end(); ++it)
        if(it->second > cnt) v.push_back(it->first);
    int l = 0, r = 0, len = 1e7;
    for(int i = 0; i < s.length(); ++i) {
        int f = 1;
        m1[s[i]]++;
        for(int j = 0; j < v.size(); ++j)
            if(m1[v[j]] < m[v[j]] - cnt) f = 0;
        if(f == 0) r++;
        else {
            len = min(len, r - l + 1);
            l++;
            while(l <= r) {
                f = 1;
                m1[s[l - 1]]--;
                for(int j = 0; j < v.size(); ++j)
                    if(m1[v[j]] < m[v[j]] - cnt) f = 0;
                if(f == 0) {
                    r++;
                    break;
                }
                else
                    len = min(len, r - l + 1);
                l++;
            }
        }
    }
    cout << len;
}


4.做书架,不知道用啥,暴力了...
#字节笔试##字节跳动23秋招笔试心得体会#
全部评论
第四题,两个有序的双端队列,,一个递增,一个递减,加上滑动窗口
点赞 回复 分享
发布于 2022-09-18 15:25 湖北

相关推荐

无一技之长怎么办:别去右边,售前,实施,需求分析一起,这是把人当牛马用啊,快跑,这些岗位天花板很低的
点赞 评论 收藏
分享
02-22 20:28
重庆大学 Java
程序员牛肉:首先不要焦虑,你肯定是有希望的。 首先我觉得你得好好想一想自己想要什么。找不到开发岗就一定是失败的吗?那开发岗的35岁危机怎么说?因此无论是找工作还是考公我觉得你都需要慎重的想一想。但你一定要避开这样一个误区:“我是因为找不到工作所以不得不选择考公”。 千万不要这么想。你这个学历挺好的了,因此你投后端岗肯定是有面试机会的。有多少人简历写的再牛逼,直接连机筛简历都过不去有啥用?因此你先保持自信一点。 以你现在的水平的话,其实如果想要找到暑期实习就两个月:一个月做项目+深挖,并且不断的背八股。只要自己辛苦一点,五月份之前肯定是可以找到暑期实习的,你有点太过于高看大家之间的技术差距了。不要焦虑不要焦虑。 除此之外说回你这个简历内容的话,基本可以全丢了。如果想做后端,先踏踏实实做两个项目再说+背八股再说。如果想考公,那就直接备战考公。 但是但是就像我前面说的:你考公的理由可以是因为想追求稳定,想追求轻松。但唯独不能是因为觉得自己找不到工作。不能这么小瞧自己和自己的学历。
点赞 评论 收藏
分享
评论
2
2
分享

创作者周榜

更多
牛客网
牛客企业服务