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

相关推荐

12-06 20:47
已编辑
复旦大学 C++
华为 终端小艺 定级估计是15a
khj:只要家里条件还行和不愿意太卷真别去华为这种农村做题家云集的地方
点赞 评论 收藏
分享
牛客868257804号:九个中铁八个中建
点赞 评论 收藏
分享
10-24 13:36
门头沟学院 Java
Zzzzoooo:更新:今天下午有hr联系我去不去客户端,拒了
点赞 评论 收藏
分享
评论
点赞
5
分享
牛客网
牛客企业服务