帆软笔试,最后一题一直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

相关推荐

ArisRobert:统一解释一下,第4点的意思是,公司按需通知员工,没被通知到的员工是没法去上班的,所以只要没被通知到,就自动离职。就是一种比较抽象的裁员。
点赞 评论 收藏
分享
Yushuu:你的确很厉害,但是有一个小问题:谁问你了?我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了😆
点赞 评论 收藏
分享
评论
点赞
5
分享
牛客网
牛客企业服务