2023 华为笔试题 0906

笔试时间:2023年9月6日 秋招

第一题

题目:每日股票价格

给定某只股票连续N天的价格列表stockPrices,其中stockPrices[i]。表示服票某天的价格,请生成一个新列表,对应位置输出为:要想等到股票价格上涨,至少需要等待的天数,如果股票价格不上涨,对应位置输出为0

解答要求

时间限制:C/C++ 500ms其他语言: 1000ms内存限制: C/C++ 256MB,其他语言:512MB

输入描述

第一行表示第二行元素的个数N;

第二行为用空格隔开的整数,表示每天股票的价格。

其中0<N<=1000000,每天股票价格为正整数

输出描述

输出为用空格分隔的长度为N的列表,对应位置为:要想等到股票价格上涨,至少需要等待的天数

样例输入

5

33 34 14 12 16

样例输出

1 0 2 1 0

解释:

stockPrices =[33,34,14,12,16]

当i=0时,stockPrices[0] =33,下次价格上涨stockPrices[1]=34,此处输出为 1-0=1

参考题解

下一个更大的元素

C++:[此代码未进行大量数据的测试,仅供参考]

#include <iostream>
#include <vector>
#include <stack>

using namespace std;

int main() {
    int N;
    cin >> N;
    vector<int> price(N);

    for (int i = 0; i < N; i++) {
        cin >> price[i];
    }

    vector<int> sk;
    vector<int> res(N, 0);

    for (int i = 0; i < N; i++) {
        while (!sk.empty() && price[sk.back()] < price[i]) {
            int tp = sk.back();
            sk.pop_back();
            res[tp] = i - tp;
        }
        sk.push_back(i);
    }

    for (int i = 0; i < N - 1; i++) {
        cout << res[i] << " ";
    }
    cout << res[N - 1] << endl;

    return 0;
}

Java:[此代码未进行大量数据的测试,仅供参考]

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int N = input.nextInt();
        int[] price = new int[N];

        for (int i = 0; i < N; i++) {
            price[i] = input.nextInt();
        }

        Stack<Integer> sk = new Stack<>();
        int[] res = new int[N];

        for (int i = 0; i < N; i++) {
            while (!sk.isEmpty() && price[sk.peek()] < price[i]) {
                int tp = sk.pop();
                res[tp] = i - tp;
            }
            sk.push(i);
        }

        for (int i = 0; i < N - 1; i++) {
            System.out.print(res[i] + " ");
        }
        System.out.println(res[N - 1]);
    }
}

Python:[此代码未进行大量数据的测试,仅供参考]

N = int(input())
price = [int(c) for c in input().split()]

sk = []
res = [0]*N
for i in range(N):
    while sk and price[sk[-1]] < price[i]:
        tp = sk.pop()
        res[tp] = i-tp
    sk.append(i)

for i in range(N-1):
    print(res[i], end=" ")
print(res[-1])

第二题

题目:中庸行者

给定一个m*n的整数阵作为地图,短阵数值为地形高度;中庸行者选择地图中的任意一点作为起点,尝试往上、下、左、右四个相邻格子移动;

移动时有如下约束:

  • 中庸行者只能上坡或者下坡,不能走到高度相同的点;
  • 不允许连续上坡或者连续下坡,需要交替进行;
  • 每个位置只能经过一次,不能重复行走;

请给出中庸行者在本地图内,能连续移动的最大次数。

解答要求

时间限制: C/C++500ms,其他语言:1000ms内存限制: C/C++ 256MB,其他语言:512MB

输入描述

一个只包含整数的二维数组:

1.3 3

2.4 7 8

3.8 6 6

4.2 6 4

第一行两个数字,分别为行数和每行的列数

后续数据为矩阵地图内容

矩阵边长范围:[1,8];

地形高度范围:[0,100000];

输出描述

一个整数,代表中庸行者在本地图内,能连续移动的最大次数。

样例输入

2 2

1 2

4 3

样例输出

3

解释

3->4->1->2

参考题解

回溯

C++:

#include <iostream>
#include <vector>
#include <set>

using namespace std;

int m, n;
vector<vector<int>> matrix;

int dfs(int i, int j, int k, set<pair<int, int>>& vst) {
    int ans = 0;
    int dir[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
    
    for (int d = 0; d < 4; d++) {
        int ni = i + dir[d][0];
        int nj = j + dir[d][1];

        if (ni < 0 || nj < 0 || ni >= m || nj >= n || matrix[ni][nj] == matrix[i][j] || vst.count({ni, nj}) > 0) continue;
        
        if ((k == 0 && matrix[ni][nj] <= matrix[i][j]) || (k == 1 && matrix[ni][nj] >= matrix[i][j])) continue;
        
        vst.insert({i, j});
        ans = max(ans, dfs(ni, nj, k ^ 1, vst) + 1);
        vst.erase({i, j});
    }
    
    return ans;
}

int main() {
    cin >> m >> n;
    matrix.resize(m, vector<int>(n));

    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            cin >> matrix[i][j];
        }
    }

    int res = 0;
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            set<pair<int, int>> vst; // 使用set存储已访问的点
            res = max(res, max(dfs(i, j, 0, vst), dfs(i, j, 1, vst)));
        }
    }

    cout << res << endl;

    return 0;
}

Java:

import java.util.*;

public class Main {
    static int m, n;
    static int[][] matrix;

    static int dfs(int i, int j, int k, Set<Pair> vst) {
        int ans = 0;
        int[][] dir = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};

        for (int[] d : dir) {
            int ni = i + d[0];
            int nj = j + d[1];

            if (ni < 0 || nj < 0 || ni >= m || nj >= n || matrix[ni][nj] == matrix[i][j] || vst.contains(new Pair(ni, nj))) continue;

            if ((k == 0 && matrix[ni][nj] <= matrix[i][j]) || (k == 1 && matrix[ni][nj] >= matrix[i][j])) continue;

            vst.add(new Pair(i, j));
            ans = Math.max(ans, dfs(ni, nj, k ^ 1, vst) + 1);
            vst.remove(new Pair(i, j));
        }

        return ans;
    }

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        m = input.nextInt();
        n = input.nextInt();
        matrix = new int[m][n];

        for (int i = 0; i < m; i++) {
  

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

2023 秋招笔试题汇总解析 文章被收录于专栏

2023秋招各大笔试题汇总,c++,java,python多种语言分析,解答。

全部评论
求问一下华为笔试是几点钟开始呀
点赞
送花
回复
分享
发布于 2023-09-12 01:02 北京
第二道题就把我难倒了,第三道题看不见
点赞
送花
回复
分享
发布于 2023-09-28 21:54 北京
秋招专场
校招火热招聘中
官网直投

相关推荐

5 44 评论
分享
牛客网
牛客企业服务