250322网易互娱后端暑期笔试

贴个Java代码

求股票购买和售出的最大收益

贪心,如果这一天存在正数的收益,那么就直接买入,第二天售出即可。因为这样,就可以保证下一次,可以买到更多的股票

import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextInt()) { // 注意 while 处理多个 case
            int N = in.nextInt(), M = in.nextInt(), K = in.nextInt();
            double[][] nums = new double[N][M];
            for (int i = 0; i < N; i++) {
                for (int j = 0; j < M; j++) {
                    nums[i][j] = in.nextDouble();
                }
            }
            double res = K;
            int[][] records = new int[N][2];
            for (int i = 0; i < N; i++) {  // 遍历每一天的股票行情
                int[] cur = new int[2];
                if (i == 0) cur[0] = -1;  // 第0天没有卖出
                else cur[0] = records[i-1][1];  // 这一天的卖出,就是上一天的买入
                double max = -(int)1e9;
                int maxIdx = -1;
                if (i == N-1) cur[1] = -1;  // 最后一天没有买入
                else {
                    for (int j = 0; j < M; j++) {  // 找到这一天最大收益的股票
                        if (nums[i+1][j]/nums[i][j] > max) {
                            max = nums[i+1][j]/nums[i][j];
                            maxIdx = j;
                        }
                    }
                    if (max > 1) {  // 大于1才有收益
                        cur[1] = maxIdx;
                        res *= max;
                    } else {
                        cur[1] = -1;
                    }
                }
                records[i] = cur;
            }
            System.out.println(String.format("%.4f", res));
            for (int i = 0; i < N; i++) {
                System.out.println(records[i][0] + " " + records[i][1]);
            }
        }
    }
}

计算2048矩阵在上下左右移动后的结果矩阵

艰难模拟,写了好久。。

刚开始没考虑到中间有0值的情况,卡在9%,比如说 8 0 8 0 左移的结果是 16 0 0 0

import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextInt()) { // 注意 while 处理多个 case
            int T = in.nextInt();
            while (T-- > 0) {
                int c = in.nextInt();
                int[] ops = new int[c];
                for (int i = 0; i < c; i++) ops[i] = in.nextInt();
                int m = in.nextInt(), n = in.nextInt();
                int[][] grid = new int[m][n];
                for (int i = 0; i < m; i++) {
                    for (int j = 0; j < n; j++) {
                        grid[i][j] = in.nextInt();
                    }
                }
                for (int op : ops) {
                    if (op == 0) { // up
                        for (int j = 0; j < n; j++) {
                            int idx = 0;  // 要更新写入的坐标
                            for (int i = 0; i < m; i++) {
                                if (grid[i][j] == 0) continue;  // 跳过0值
                                int cur = grid[i][j];  // 当前不为0的值
                                while (i+1 < m && grid[i+1][j] == 0) i++;  // 找到下一个不为0的值
                                if (i+1 < m && cur == grid[i+1][j]) {  // 相等则合并
                                    grid[idx++][j] = cur*2;;
                                    i++;
                                } else {  // 不相等则保存当前值到坐标即可
                                    grid[idx++][j] = cur;
                                }
                            }
                            while (idx < m) grid[idx++][j] = 0;
                            // System.out.println(Arrays.toString(col));
                        }
                    } else if (op == 1) {  // left
                        for (int i = 0; i < m; i++) {
                            int[] row = grid[i];
                            int idx = 0;
                            for (int j = 0; j < n; j++) {
                                if (row[j] == 0) continue;
                                int cur = row[j];
                                while (j+1 < n && row[j+1] == 0) j++;
                                if (j+1 < n && cur == row[j+1]) {
                                    row[idx++] = cur*2;
                                    j++;
                                } else {
                                    row[idx++] = cur;
                                }
                            }
                            while (idx < n) row[idx++] = 0;
                        }
                    } else if (op == 2) {  // down
                        for (int j = 0; j < n; j++) {
                            int idx = m-1;
                            for (int i = m-1; i >= 0; i--) {
                                if (grid[i][j] == 0) continue;
                                int cur = grid[i][j];
                                while (i-1 >= 0 && grid[i-1][j] == 0) i--;                            
                                if (i-1 >= 0 && cur == grid[i-1][j]) {
                                    grid[idx--][j] = cur*2;
                                    i--;
                                } else {
                                    grid[idx--][j] = cur;
                                }
                            }
                            while (idx >= 0) grid[idx--][j] = 0;
                        }
                    } else {  //right
                        for (int i = 0; i < m; i++) {
                            int[] row = grid[i];
                            int idx = n-1;
                            for (int j = n-1; j >= 0; j--) {
                                if (row[j] == 0) continue;
                                int cur = row[j];
                                while (j-1 >= 0 && row[j-1] == 0) j--;
                                if (j-1 >= 0 && cur == row[j-1]) {
                                    row[idx--] = cur*2;
                                    j--;
                                } else {
                                    row[idx--] = cur;
                                }
                            }
                            while (idx >= 0) row[idx--] = 0;
                        }
                    }
                }
                for (int i = 0; i < m; i++) {
                    for (int j = 0; j < n; j++) {
                        System.out.print(grid[i][j] + " ");
                    }
                    System.out.println();
                }
            }
        }
    }
}

a*x + b*y + c*z + d*w = n,求xyzw的可能取值,输出字典序最小的那个结果

xyzw的范围是0到2500

提前处理c*z + d*w的所有可能结果,用HashMap保存,然后遍历a和b查看是否有满足的情况

import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextInt()) { // 注意 while 处理多个 case
            int a = in.nextInt(), b = in.nextInt(), c = in.nextInt(), d = in.nextInt(), n = in.nextInt();
            HashMap<Long, int[]> map = new HashMap<>();
            for (int i = 0; i <= 2500; i++) {  // `c*z + d*w`的所有可能结果
                for (int j = 0; j <= 2500; j++) {
                    map.putIfAbsent((long)i*c + (long)j*d, new int[]{i, j});  // 这里不能覆盖,才能保证c和d字典序最小
                }
            }
            String res = "";
            for (int i = 0; i <= 2500; i++) {
                if (res.length() > 0) break;
                for (int j = 0; j <= 2500; j++) {
                    long cur = (long)i*a + (long)j*b;
                    if (n-cur < 0) break;  // 由于都大于0,所以更大的j更不行了,这里可以提前跳出
                    int[] val = map.get(n-cur);
                    if (val != null) {  // 满足题目条件,保存结果
                        res = i + " " + j + " " + val[0] + " " + val[1];
                        break;
                    }
                }
            }
            if (res.length() > 0) System.out.println(res);
            else System.out.println(-1);
        }
    }
}

全部评论

相关推荐

评论
4
1
分享

创作者周榜

更多
正在热议
更多
# 腾讯音乐求职进展汇总 #
67483次浏览 364人参与
# 机械人的薪资开到多少,才适合去? #
91610次浏览 396人参与
# 招行数字金融训练营 #
53841次浏览 251人参与
# 携程求职进展汇总 #
218061次浏览 1893人参与
# 投递几十家公司,到现在0offer,大家都一样吗 #
181835次浏览 1314人参与
# 面试之前应该如何准备? #
9167次浏览 307人参与
# 腾讯云智研发2025实习生招聘 #
34002次浏览 355人参与
# 如何看待应届生身份? #
13914次浏览 252人参与
# 通信和硬件还有转码的必要吗 #
48117次浏览 494人参与
# 双非本科的出路是什么? #
111302次浏览 1083人参与
# 0offer互助地 #
303417次浏览 2530人参与
# 你遇到过哪些神仙同事 #
55783次浏览 552人参与
# 总结:offer选择,我是怎么选的 #
102126次浏览 740人参与
# 选了这个offer,你有没有后悔? #
499772次浏览 3606人参与
# 腾讯云智研发工作体验 #
15533次浏览 121人参与
# 工作中,努力重要还是选择重要? #
89049次浏览 1218人参与
# 招银网络求职进展汇总 #
95648次浏览 608人参与
# lastday知无不言 #
42856次浏览 404人参与
# 学历or实习经历,哪个更重要 #
81041次浏览 625人参与
# 第一份工作应该选高薪还是热爱? #
38746次浏览 347人参与
# 今年秋招哪家公司给的薪资最良心? #
188987次浏览 1109人参与
# 毕业后不工作的日子里我在做什么 #
150349次浏览 1313人参与
牛客网
牛客企业服务