目前辞职在家,想面试一下试试水,结果笔试题一做 emo 了

2022-02-09 22:23:05 +08:00
 unregister

Java 转行,目前加起来 Java 开发经验一年多一点,HR 给我发了两道题,第一道是具有层级关系的城市,例如"中国 广州","中国 浙江 杭州" 一个 List 最后应该是转成树状图输出,最后还是没答完,后面去 leetcode 上看了一下,应该是属于 hard 难度的。想到前景越来越黯淡,emo 了。而且面的是外包,面试官都没见到。

6866 次点击
所在节点    Java
45 条回复
xiadong1994
2022-02-10 02:12:13 +08:00
@unregister 序列化与反序列化是 hard 是因为给的输入是遍历的结果,你的这道题给的是从 root 到某一个 node 的 path ,提供了更多的 tree 结构信息,顶多是个 medium 。
msg7086
2022-02-10 06:56:36 +08:00
撑死 medium ,我觉得算 easy 都可以。
如果不懂递归,那至少懂面向对象吧。
自己建一个类 Region ,然后类成员 List<Region> subRegions ,类方法 append(String fullRegionPath),把字符串的第一段切出来添加进 subRegions ,然后把剩下的交给 subRegion.append()不就行了。
如果我是面试官,我更希望面试者用面向对象的方法去实现递归,而不是像上面一位老哥那样开个 for 循环去搞。
kran
2022-02-10 08:23:53 +08:00
map+引用,单次循环就可以了
VeryZero
2022-02-10 09:00:58 +08:00
这就是最基本的递归啊,而且工作中很常用。比如分类树,目录树
fpure
2022-02-10 09:39:04 +08:00
@unregister 这个题我觉得递归都可以不用吧
Junzhou
2022-02-10 09:44:32 +08:00
@unregister 这个感觉没想象中的麻烦,可能力扣中等难度? 遍历这个列表,拿到每一条记录,通过字符分割,中国 广东 广州 越秀 ,拿到四个不同级别的行政区,然后处理下一个,中国 广东 深圳 南山 广东已经存在了,直接把深圳加入到广东的子节点,南山加到深圳的子节点,如果是 中国 广东 深圳 宝安 根据中国找到广东,找到深圳,宝安不存在,将宝安加入到深圳的子节点。以此类推?
Junzhou
2022-02-10 09:45:53 +08:00
@rabbbit 同名不影响,root 节点到 node 节点的路径都给你了。
illuz
2022-02-10 09:46:45 +08:00
水题,老哥多刷刷算法吧
这种树状结构工程里还是挺常见的,这就 emo 说明水平一般
fpure
2022-02-10 10:10:11 +08:00
package com.example;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

import com.google.gson.GsonBuilder;

public class x {
@SuppressWarnings("unchecked")
public static void main(String[] args) {
List<String> list = Arrays.asList("中国 广州", "中国 浙江 杭州");
HashMap<String, Object> root = new HashMap<>();
for (String s : list) {
HashMap<String, Object> node = root;
String[] ss = s.split(" ");
for (int i = 0; i < ss.length; i++) {
HashMap<String, Object> subNode = (HashMap<String, Object>) node.get(ss[i]);
if (subNode == null) {
subNode = new HashMap<>();
node.put(ss[i], subNode);
}
node = subNode;
}
}
System.out.println(new GsonBuilder()
.setPrettyPrinting()
.serializeNulls()
.create().toJson(root));
}
}
Vegetable
2022-02-10 10:16:00 +08:00
这是 hard 吗...
OldCarMan
2022-02-10 10:23:11 +08:00
@unregister #8 不知道我有没有理解错,这道题最终目的是以树状结构的 json 数据输出,而不是中间一定要套上树这种数据结构,如果是这样的话,直接用 map 多层嵌套+递归和判断 就行了,个人觉得(暗中观察够🐶)。
dqzcwxb
2022-02-10 11:05:24 +08:00

所有的递归都可以写成循环
rabbbit
2022-02-10 11:06:30 +08:00
@Junzhou 呃,我是说我写的那个不对啦.
昨天太晚了,改成这样就好了.

import java.util.*;

public class App {
  public static void main(String[] args) {
   Map<String, Map> map = new HashMap();
   String[] cityList = {"中国 浙江 杭州","中国","中国 广东", "中国 广东 广州 越秀区", "中国 达拉崩吧 广州"};
   for (String cityStr: cityList) {
    Map<String, Map> parentMap = map;
    for (String key: cityStr.split(" ")) {
     Map mapOfKey = addMap(key, parentMap);
     parentMap = mapOfKey;
   }
  }
   System.out.println(toJSON(map, 0));
 }

  public static Map<String, Map> addMap(String key,Map<String, Map> map ) {
   if(!map.containsKey(key)) {
    map.put(key, new HashMap<String, Map>());
  }
   return map.get(key);
 }

  public static String toJSON(Map<String, Map> map, int intend) {
   String str = "{";
   List<String> keys = new ArrayList(map.keySet());
   if( keys.size() > 0) {
    str += "\r\n";
  }
   for (int i = 0; i < keys.size(); i++) {
    String key = keys.get(i);
    str += geneSpace(intend + 2) + key + ": " + toJSON(map.get(key), intend + 2);
    if(i < keys.size() - 1) {
     str += ",";
   }
    str += "\r\n";
  }
   if( keys.size() > 0) {
    str += geneSpace(intend);
  }
   str += "}";
   return str;
 }

  public static String geneSpace(int len) {
   return new String(new char[len]).replace('\0', ' ');
 }
}
cassyfar
2022-02-10 11:25:51 +08:00
@rabbbit 你这个数据结构是错的吧,题主已经说明了最后要存进一个树里面。

数据结构用这个,然后每查看一组,就遍历插入新节点即可。
class Node {
String id;
List<Node> children ;
}
unregister
2022-02-10 11:26:19 +08:00
@Junzhou 嗯,是我太水了
@fpure 厉害了,完美啊。
@rabbbit 厉害,学习了,达拉崩吧,很 happy 啊😂
rabbbit
2022-02-10 11:32:07 +08:00
@cassyfar
这种面试题应该思路对了就行,没必要非得是 LeetCode 那种树结构.
Map 表示能方便点, 子 List 还得遍历去搜.
unregister
2022-02-10 11:33:11 +08:00
@cassyfar 这个应该是用 Map 实现的,只是需要按照要求输出那个树状图就行了。
Tianyan
2022-02-10 13:14:20 +08:00
灵活就业者(失业者)超过 2 亿
unregister
2022-02-10 13:32:06 +08:00
@whileFalse 嗯,对我来说有一点,这也知道和别人的差距在哪里。
aikilan
2022-02-10 16:11:44 +08:00
const data = ["中国 广州 深圳", "中国 广州 佛山", "中国 浙江 杭州"];

const onStart = (data) => {
const res = {};
const onGen = (result, row) => {
if(!row.length){
return
}
const item = row[0];
if(result[item]){
onGen(result[item], row.slice(1))
}else{
result[item] = {};
onGen(result[item], row.slice(1))
}
}
for(let i in data){
onGen(res, data[i].split(' '));
}
return res
}
onStart(data)

//{ '中国': { '广州': { '深圳': {}, '佛山': {} }, '浙江': { '杭州': {} } } }

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

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

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

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

© 2021 V2EX