建信金科笔试编程题

1、给一个字符串,只包含字母和空格,其中由连续的字母组成的是单词,问你字符串中有几个连续的三个单词满足:第一个单词=第二个单词,且不等于第三个单词。

解题思路:先做字符串分割,然后把分割出来的单词放入列表(C++中的或者Java中的),然后就是简单的枚举判断,符合条件计数器+1.

2、给定一个链表,要求把不存在相邻元素相等的连续段进行反转操作,返回操作后的链表。

解题思路:我的做法是先把链表转成列表,方便访问相邻元素,然后枚举元素,若存在相邻元素与之相等,那么就直接将该元素尾插到新链表中,否则就先存放到列表中,直到出现存在相邻元素与之相等的元素,再将反转后的列表尾插到新链表中。

由于采用的是枚举,就算加上反转操作,时间复杂度也还是线性的。

考试代码参考:

#include <bits/stdc++.h>
#define pb push_back
using namespace std;
struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(nullptr) {}
};
class Solution {
public:
    ListNode *convert_to_list(vector<int>&a) {
        ListNode *head = new ListNode(-1);
        head->next = NULL;
        ListNode *p = head;
        for(int i = 0; i < a.size(); i++) {
            ListNode *q = new ListNode(a[i]);
            p->next = q;
            p = q;
        }
        p->next = NULL;
        return head->next;
    }
    void output(ListNode *head) {
        ListNode *p = head;
        while(p) {
            cout << p->val << " ";
            p = p->next;
        }
    }
    ListNode *solve(ListNode *head) {
        if(head == NULL)    return NULL;
        vector<int>a, v;
        ListNode *p = head;
        while(p) {
            a.pb(p->val);
            p = p->next;
        }
        ListNode *L = new ListNode(-1);
        L->next = L;
        p = L;
        for(int i = 0; i < a.size(); i++) {
            if(i == 0) {
                if(a[i] == a[i + 1]) {
                    ListNode *q = new ListNode(a[i]);
                    p->next = q;
                    p = q;
                }
                else {
                    v.pb(a[i]);
                }
                continue;
            }
            if(i == a.size() - 1) {
                if(a[i] == a[i - 1]) {
                    ListNode *q = new ListNode(a[i]);
                    p->next = q;
                    p = q;
                }
                else {
                    v.pb(a[i]);
                }
                continue;
            }
            if(a[i] == a[i - 1] || a[i] == a[i + 1]) {
                reverse(v.begin(), v.end());
                for(auto val : v) {
                    ListNode *q = new ListNode(val);
                    p->next = q;
                    p = q;
                }
                v.clear();
                ListNode *q = new ListNode(a[i]);
                p->next = q;
                p = q;
            }
            else {
                v.pb(a[i]);
            }
        }
        if(v.size()) {
            reverse(v.begin(), v.end());
            for(auto val : v) {
                ListNode *q = new ListNode(val);
                p->next = q;
                p = q;
            }
        }
        p->next = NULL;
        return L->next;
    }
};
int main() {
    int n;
    cin >> n;
    vector<int>a(n);
    for(int i = 0; i < n; i++)    cin >> a[i];
    Solution sol = Solution();
    ListNode *list = sol.convert_to_list(a);
    ListNode *res = sol.solve(list);
    sol.output(res);
}
/*
input:
11
1 2 2 3 4 5 3 3 3 4 5
output:
1 2 2 5 4 3 3 3 3 5 4
*/

通过率:100%

当然考虑代码量的话,也可以先操作列表,再由列表转链表。与此同时,代码可读性可能就差点了。

参考代码:

#include <bits/stdc++.h>
#define pb push_back
using namespace std;
struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(nullptr) {}
};
class Solution {
public:
    ListNode *convert_to_list(vector<int>&a) {
        ListNode *head = new ListNode(-1);
        head->next = NULL;
        ListNode *p = head;
        for(int i = 0; i < a.size(); i++) {
            ListNode *q = new ListNode(a[i]);
            p->next = q;
            p = q;
        }
        p->next = NULL;
        return head->next;
    }
    void output(ListNode *head) {
        ListNode *p = head;
        while(p) {
            cout << p->val << " ";
            p = p->next;
        }
    }
    ListNode *solve(ListNode *head) {
        if(head == NULL)    return NULL;
        vector<int>a;
        ListNode *p = head;
        while(p) {
            a.pb(p->val);
            p = p->next;
        }
        int l = 0;
        bool f = false;//是否位于不存在相邻元素相等的连续段 
        for(int i = 1; i < a.size(); i++) {
            if(i == a.size() - 1) {
                if(a[i] != a[i - 1]) {
                    reverse(a.begin() + l, a.end());
                }
                continue;
            }
            if(a[i] == a[i - 1] || a[i] == a[i + 1]) {
                if(f) {
                    reverse(a.begin() + l, a.begin() + i);
                }
                f = false;
            }
            else {
                if(!f) {
                    l = i;//记录一下开始出现相邻元素不相等的元素的位置 
                    f = true;
                }    
            }
        }
        ListNode *L = convert_to_list(a);
        return L;
    }
};
int main() {
    int n;
    cin >> n;
    vector<int>a(n);
    for(int i = 0; i < n; i++)    cin >> a[i];
    Solution sol = Solution();
    ListNode *list = sol.convert_to_list(a);
    ListNode *res = sol.solve(list);
    sol.output(res);
}
/*
input:
11
1 2 2 3 4 5 3 3 3 4 5
output:
1 2 2 5 4 3 3 3 3 5 4
*/
#校招##建信金科##秋招#
全部评论
第一题的用例让我怀疑这公司够不够正经😏
4 回复 分享
发布于 2022-10-30 22:52 上海
第二题除了python什么都可以用,直接g
2 回复 分享
发布于 2022-10-29 21:57 重庆
哭了,java只能reverse整个数组,当时想过又觉得新开辟数组很麻烦。 另外有一个疑惑想问一下,就是reverse的a.begin()+i那里,C++的是end是闭区间的吗,是就没问题。不是的话,不应该在i指向第二个3(5后面那个3)的时候进行反转吗,这样就多翻转了一个? 求指教谢谢答主
1 回复 分享
发布于 2022-10-30 20:26 天津
大佬写的是对的  没有bug
1 回复 分享
发布于 2022-10-29 21:55 湖北
友友,你是啥时候申请的,你的申请状态是笔试吗
点赞 回复 分享
发布于 2022-10-31 20:12 广东
好牛
点赞 回复 分享
发布于 2022-10-30 11:44 上海

相关推荐

来,说点可能被同行“骂”的大实话。🙊当初接数字马力Offer时,朋友都说:“蚂蚁的“内包”公司?你想清楚啊!”但入职快一年后的今天,我反而对他有了不一样的看法!🔹&nbsp;是偏见?还是信息差!之前没入职之前外面都在说什么岗位低人一等这类。实际上:这种情况不可至否,不能保证每个团队都是其乐融融。但我在的部门以及我了解的周边同事都还是十分好相处的~和蚂蚁师兄师姐之间也经常开一些小玩笑。总之:身份是蚂蚁公司给的,地位是自己挣的(一个傲娇女孩的自述)。🔹&nbsp;待遇?玩的就是真实!试用期工资全额发!六点下班跑得快(早9晚6或者早10晚7,动态打卡),公积金顶格交。别听那些画饼的,到手的钱和下班的时间才是真的(都是牛马何必难为牛马)。🔹&nbsp;能不能学到技术?来了就“后悔”!我们拥有权限直通蚂蚁知识库,技术栈多到学不完。说“学不到东西”的人,来了可能后悔——后悔来晚了(哈哈哈哈,可以不学但是不能没有)!💥&nbsp;内推地址:https://app.mokahr.com/su/ueoyhg❗我的内推码:NTA6Nvs走我的内推,可以直达业务部门,面试流程更快速,进度可查!今天新放HC,之前挂过也能再战!秋招已经正式开始啦~机会就摆在这,敢不敢来试一试呢?(和我一样,做个勇敢的女孩)
下午吃泡馍:数字马力的薪资一般哇,5年经验的java/测试就给人一万出头,而且刚入职第三天就让人出差,而且是出半年
帮你内推|数字马力 校招
点赞 评论 收藏
分享
评论
17
65
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务