华为嵌入式软件开发工程师笔试5-10

公号:嵌入式未来

《嵌入式软件开发笔试与面试手册》https://blog.nowcoder.net/zhuanlan/jvN8gj

《嵌入式软件笔试-2023年真题汇总》https://blog.nowcoder.net/zhuanlan/0oDWVm

题目1:

1、数据合并

向一个空栈压入正整数,每当压入一个整数时,执行以下规则(设:栈顶至栈底整数依次编号为n1、n2...nx,n1为最新压入的整数)

1.如果n1=n2,则n1、n2全部出栈,压入新数据m(m=2*n1)。

2.如果n1=n2+...+ny(y的范国为[3,x]) ,则n1、n2...ny全部出栈,压入新数据m(m=2*n1).

3.如果上述规则都不满足,则不做操作

如: 依次向栈压入6、1、2、3,当压入2时,栈顶至栈底依次为[2、1、6];当压入3时,3=2+1,3、2、1全部出栈,重新入栈整数6(此时n1=3,因此m=2*3=6),此时栈顶至栈底依次为[6、6];6=6,两个6全部出栈,压入12(此时n1=6,因此m=2*6=12),最终栈中只剩一个元素12.

向栈中输入一串数字,请输出应用此规则后栈中最终存留的数字

输入

使用单个空格隔开的正整数的字符串,如"5 6 7 8”,左边数字先入栈。

输出

最终栈中存留的元素值,元素值使用单个空格隔开,如"8 7 6 5”,从左至右依次为栈顶至栈底的数字。

样例1

输入: 10 20 50 80 1 1

输出: 2 160

解释:向栈压入80时,10+20+50=80,数据合并后入栈160,压入两个1时,合并为2,最终栈顶至栈底的数字为2和160。

样例2

输入: 6 4 8 13 9

输出: 9 13 8 4 6

#include <iostream>
#include <vector>
#include <string>
#include <sstream>

using namespace std;

vector<int> st;

void solve() {
    if (st.size() > 1 && st.back() == st[st.size() - 2]) {
        int num = st.back();
        st.pop_back();
        st.pop_back();
        st.push_back(2 * num);
        solve();
    } else if (st.size() >= 3) {
        int sum_ = 0;
        for (int i = 0; i < st.size() - 1; ++i) {
            sum_ += st[st.size() - i - 2];
            if (sum_ >= st.back()) {
                if (sum_ == st.back()) {
                    for (int j = 0; j < i+2; ++j) st.pop_back();
                    st.push_back(2 * sum_);
                    solve();
                }
                break;
            }
        }
    }
}

int main() {
    string line;
    getline(cin, line);
    istringstream iss(line);

    int num;
    while (iss >> num) {
        st.push_back(num);
        solve();
    }

    while (!st.empty()) {
        cout << st.back();
        st.pop_back();
        if (!st.empty()) cout << " ";
        else cout << "\n";
    }

    return 0;
}

题目2:

敌占区地下工作者冒死提供了加密后的字符串,需要你根据质先定好的方式进行解密,得到其中真正的密码。加密后字符串M是由0-9这10个数字组成的字符串,你手上是个给定秘钥数字N和一个运算符k (加减乘中的一个),需要按如下规则找出真正的密码

1.截取M中的某一段数字x,和数字N进行k运算 (x k N) ,如果结果是一个所有位数相同的数,则这段数字有可能就是所找密码,例如x为222,N为3,k为*,则计算结果是222*3=666,满足要求,x是所寻目标密码串之一。

2.如果存在满足第1点的多种情况,则以计算结果最大的为准;

3.如果没有找到符合条件的密码串,则输出-1,表示密码串不存在

4.M的长度<100,N为正整数,且N<=9999999999,3<=所找密码长度<=12。k为+或-或*中的一种,不考虑除法。为避免数据过于庞大,约定在乘法场景下,乘数最大为3位数。

输入

提供加密后字特串M,秘们数字N和运约符k,例如:

(密字特串M)748443217098

(秘钥数字N) 123

(运符k)+

输出

满足计算结果所有位数相同,且计算结果最大的值。

例如:上还例子截取44321,和123相加,则为44321+123=44444,结果所有位的数字字符相同,包括个位数、十位数、百位数、千位数和万位数都是同一个数字字符4,且其值最大。

(目标字符串) 4

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

本专栏主要发布嵌入式软件开发相关岗位2023年(2024届)的笔试真题(嵌入式软件开发、通用软件开发、C/C++软件开发、算法工程师、数据开发、测试开发等)主要是算法编程题,其中一些岗位笔试含有对应的选择题、填空题、简单题。

全部评论
这解法是不是还可以再优化?
点赞 回复 分享
发布于 2023-05-13 09:33 甘肃
你这个数据合并的规则能讲一下具体思路吗?
点赞 回复 分享
发布于 2023-05-12 22:54 湖南

相关推荐

牛客41406533...:回答他在课上学,一辈子待在学校的老教授用三十年前的祖传PPT一字一句的讲解,使用谭浩强红皮书作为教材在devc++里面敲出a+++++a的瞬间爆出114514个编译错误来学这样才显得专业
点赞 评论 收藏
分享
评论
点赞
7
分享

创作者周榜

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