CTO 让我们老人做做公司现在招聘的面试题,一个二维数组的题目, orz

2018-09-14 14:27:56 +08:00
 Breadykid

/**

我写了一半的代码,不知如何继续下去,求大佬

public class Ball {
	private Color color;
	private Meterial meterial;
	private int weight;
}

public enum Color {
	YELLOW("YELLOW","黄色"),
	ORANGE("ORANGE","橙色"),
	RED("RED","红色"),
	BLUE("BLUE","蓝色");
}

public enum Meterial {
	IRON("IRON","铁"),
	WOOD("WOOD","木"),
	GLASS("GLASS","玻璃");
}
    
public void calculate(Ball[] balls) {
    int totalWeight = 0;
    List<Ball> red = new ArrayList<>();
    List<Ball> orange = new ArrayList<>();
    List<Ball> yellow = new ArrayList<>();
    List<Ball> blue = new ArrayList<>();
    List<Ball> iron = new ArrayList<>();
    List<Ball> wood = new ArrayList<>();
    List<Ball> glass = new ArrayList<>();

    HashMap<String,List<Ball>> basketsMap = new HashMap();
    basketsMap.put(Color.RED.getKey(),red);
    basketsMap.put(Color.ORANGE.getKey(),orange);
    basketsMap.put(Color.YELLOW.getKey(),yellow);
    basketsMap.put(Color.BLUE.getKey(),blue);
    basketsMap.put(Meterial.IRON.getKey(),iron);
    basketsMap.put(Meterial.WOOD.getKey(),wood);
    basketsMap.put(Meterial.GLASS.getKey(),glass);

    for (int i=0; i<balls.length; i++) {
        if (basketsMap.containsKey(balls[i].getColor().getKey())) {
            List<Ball> color = basketsMap.get(balls[i].getColor().getKey());
            if (color.size()<3) {
                color.add(balls[i]);
                totalWeight+=balls[i].getWeight();
            }
            else {
                System.out.println(basketsMap.get(balls[i].getColor().getKey()).toArray().toString());
                basketsMap.remove(balls[i].getColor().getKey());
            }
        }

        if (basketsMap.containsKey(balls[i].getMeterial().getKey())) {
            List<Ball> material = basketsMap.get(balls[i].getMeterial().getKey());
            if (material.size()<3) {
                material.add(balls[i]);
                totalWeight+=balls[i].getWeight();
            }
            else {
                System.out.println(basketsMap.get(balls[i].getMeterial().getKey()).toArray().toString());
                basketsMap.remove(balls[i].getColor().getKey());
            }
        }
    }
2206 次点击
所在节点   2018
16 条回复
w0000
2018-09-14 14:35:32 +08:00
这个题目是不是没描述完整? 表示这个球筐里对球的限定 是什么意思?限定的是个数?
Breadykid
2018-09-14 14:45:38 +08:00
@w0000 意思是:7 个球筐上依次写着[红球,橙球,黄球,蓝球,铁球,木球,玻璃球],表示这个球筐里对球的限定,就是写着红球的框里可以放有“红色”属性的球的意思,可以放红木球,红铁球,红玻璃球,这样
bzw875
2018-09-14 15:04:50 +08:00
请问组成最大重量的 N 个球筐限定的组合是什么?
这句话什么意思啊,7*3=21,每个框都有球啊,不能不放
maichael
2018-09-14 15:06:34 +08:00
@bzw875 不需要把所有球都放进去的意思。
maichael
2018-09-14 15:07:08 +08:00
@w0000 限定的是比如“红球”就只能放红球或者红玻璃球之类的。
cigarzh
2018-09-14 15:08:11 +08:00
背包问题加了点限定?
maichael
2018-09-14 15:18:16 +08:00
说个最简单的思路,一个个球遍历,先找到那个框可以存放这个球,再判断这个框什么已经满了,如果满了再判断这个球是否比这个框里面三个都要轻,如果都要轻就找有没另一个框可以换。被替换下来的球重新进入队列。
Breadykid
2018-09-14 15:23:09 +08:00
@maichael 昂,我试下
Breadykid
2018-09-14 15:25:54 +08:00
@cigarzh 确实像背包问题,但我不知道怎么搞
maichael
2018-09-14 15:27:24 +08:00
@Breadykid 如果球先根据重量做一次排序的话,应该效率会高点。
Deville
2018-09-14 15:30:38 +08:00
咦,这道题,似曾相识
uleh
2018-09-14 16:06:19 +08:00
lz 你的题目归结一下就是下面这个二位数组。
算最重的时候,就按给定的框遍历一下可能的取值,把最大的取出来就行了。
例如给 N=2 (红球框,铁球框),就是下面这个矩阵 X[红]遍历一下最大的 3 个(26,36,3),然后 X[铁]遍历剩下最大的 3 个

|红 |橙|黄|蓝|
------------------
铁 |15,26|...
------------------
木 |31,36|...
------------------
玻璃 |3 |...
Breadykid
2018-09-14 16:07:40 +08:00
我最后的实现哇,如果求得是这个意思得话


public void calculate(Ball[] balls) {

final String[] colorType = {Color.RED.getKey(),Color.ORANGE.getKey(),Color.YELLOW.getKey(),Color.BLUE.getKey()};
final String[] materialType = {Meterial.IRON.getKey(),Meterial.WOOD.getKey(),Meterial.GLASS.getKey()};

// 质量排序
for (int i = 0; i < balls.length; i++) {
for (int j = 1; j < balls.length; j++) {
int a = balls[i].getWeight();
int b = balls[j].getWeight();
if (i<j && a<b) {
Ball temp = balls[i];
balls[i] = balls[j];
balls[j] = temp;
}
}
}

// color
for (int n=0; n<colorType.length; n++) {
int totalWeight = 0;
final int count = 3;
List<Ball> color = new ArrayList<>();
for (int i=0; i<balls.length; i++) {
if (colorType[n].equals(balls[i].getColor().getKey())) {
if (color.size()<count) {
System.out.println(balls[i].toString());
color.add(balls[i]);
totalWeight+=balls[i].getWeight();
}
}
}
System.out.println(String.format("%s 总质量 %s",colorType[n],totalWeight));
}

// material
for (int n=0; n<materialType.length; n++) {
int totalWeight = 0;
final int count = 3;
List<Ball> material = new ArrayList<>();
for (int i=0; i<balls.length; i++) {
if (materialType[n].equals(balls[i].getMeterial().getKey())) {
if (material.size()<count) {
System.out.println(balls[i].toString());
material.add(balls[i]);
totalWeight+=balls[i].getWeight();
}
}
}
System.out.println(String.format("%s 总质量 %s",materialType[n],totalWeight));
}
}
uleh
2018-09-14 16:07:51 +08:00
#12 修改一下说法,不是二维数组,算是个矩阵。因为你这个球之间其实没有交叉,比传统的背包问题其实还简单些。
Breadykid
2018-09-14 16:09:50 +08:00
@uleh 有道理昂
xiaoxinxiaobai
2018-09-14 16:57:18 +08:00
题都读不懂。。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/489326

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX