帆软笔试,最后一题一直33.33%,能帮忙看下不

思路是用二维数组存起来,之后按主键排序
插入排序稳定

排序之后把相同主键数据分块一起计算  
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

public class Main10 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int col = sc.nextInt();
        int row = sc.nextInt();
        int index = sc.nextInt();
        int transfer = sc.nextInt();
        int example = sc.nextInt();
        //接收数据
        int[][] ints = new int[col][row];
        for (int j = 0; j < col; j++) {
            for (int i = 0; i < row; i++) {
                ints[j][i] = sc.nextInt();
            }
        }

        //只有一行时直接求和输出
        if (col == 1) {
            int sum = 0;
            for (int i = 0; i < row; i++) {
                sum += ints[0][i];
            }
            System.out.println(sum);
        } else {
            //将转换列放入set中
            Set<Integer> set = new HashSet<>();
            set.add(ints[0][transfer]);
            //对数组进行插入排序
            for (int i = 1; i < col; i++) {
                set.add(ints[i][transfer]);

                int temp[] = new int[row];
                for (int j = 0; j < row; j++) {
                    temp[j] = ints[i][j];
                }
                while (temp[index] < ints[i - 1][index] && i > 1) {
                    for (int j = 0; j < row; j++) {
                        ints[i][j] = ints[i - 1][j];
                    }
                    i--;
                }
                for (int j = 0; j < row; j++) {
                    ints[i][j] = temp[j];
                }
            }
            //记录总值
            int sum = 0;
            int su = ints[0][index];

            Set<Integer> set1 = new HashSet<>();
            set1.add(ints[0][transfer]);
            //先计算第一行
            for (int i = 0; i < row; i++) {
                if (i != transfer) {
                    sum += ints[0][i];
                }
            }
            
            for (int i = 1; i < col; i++) {
                if (su == ints[i][index]) {
                    set1.add(ints[i][transfer]);
                    sum += ints[i][example];
                } else {
                    sum -= (set.size() - set1.size());
                    set1.clear();
                    su = ints[i][index];
                    set1.add(ints[i][transfer]);
                    //把除转换列的值放入sum
                    for (int j = 0; j < row; j++) {
                        if (j != transfer) {
                            sum += ints[i][j];
                        }
                    }
                }
            }
            //减去最后一次的
            sum -= (set.size() - set1.size());
            System.out.println(sum);
        }

    }

}

#帆软软件##笔试题目#
全部评论
是那个主键,指标列,合并那个吗?
点赞 回复 分享
发布于 2019-09-18 15:01
不是说没有编程题目吗……
点赞 回复 分享
发布于 2019-09-18 19:56
我也33.3
点赞 回复 分享
发布于 2019-09-20 16:27
真相是结果爆int要用long long存,不过你应该还存在一个错误。
点赞 回复 分享
发布于 2019-09-22 18:49
请问当初您笔试的是什么岗位啊?
点赞 回复 分享
发布于 2021-03-11 18:23

相关推荐

hso_:哈哈哈哈哈哈我没offer一样在同一道题开喷了
投递深圳同为数码等公司10个岗位
点赞 评论 收藏
分享
12-01 12:34
已编辑
广东工业大学 Java
如题,fw🐭🐭,加上准备的太晚,大三上已找不到日常实习,导致连锁反应,下学期的暑期实习找不到好的实习,导致秋招找不到中大厂,现在是中小厂Java还有考公的选择,由于有些中小厂工作强度比肩大厂,钱还少,感觉不如考公如果🐮u们是我现在这种情况,会怎么选?
负债的混子:关注你一段时间了,突然发现你头像名字都改了,想必是这段时间压力很大。关于就业还是考公的选择,就像很多牛友说的:不要美化自己没走过的路。你现在想往互联网发展,发现这条路很难走,然后想往考公发展,但是你没走过考公这条路,所以你不知道这条路的压力如何。你今年大三了,还有时间给你做选择,我希望你能够尽快的决定自己的方向,然后一条路走到黑,而不是在这里徘徊,每个人的道路是不一样的,你无法复刻别人的路,你能做的就是尽力的完善自己。 最后,我想说的是,加油,陌生人!
点赞 评论 收藏
分享
评论
点赞
5
分享
牛客网
牛客企业服务