阅文集团Java暑期实习笔试题 2020.5.19
10个单选,10个多选,1个回答题,3个编程题,1个附加题
单选多选不记得了。
回答题:
将一个Map转为JavaBean,完善方法代码,要求使用反射
public static <T> T map2bean(Map<String,Object> map,Class<T> clz) { }说实话,完全不会,反射这块自己代码没怎么写过,本来还想试试,结果这题不能使用本地IDE,只能在网页上硬打,直接跳过放弃了
结束后找到了以下代码,参考:https://blog.csdn.net/wodemale/article/details/89419852 https://www.cnblogs.com/tfper/p/9931656.html
//通过reflect———— public static Object mapToObject(Map<String, Object> map, Class<?> beanClass) throws Exception {
if (map == null)
return null;
Object obj = beanClass.newInstance();
Field[] fields = obj.getClass().getDeclaredFields();
for (Field field : fields) {
int mod = field.getModifiers();
if (Modifier.isStatic(mod) || Modifier.isFinal(mod)) {
continue;
}
field.setAccessible(true);
field.set(obj, map.get(field.getName()));
}
return obj;
}
//Introspector类———— public static <T> T map2bean(Map<String,Object> map,Class<T> clz) throws Exception{
T obj = clz.newInstance(); //创建一个需要转换为的类型的对象
//从Map中获取和属性名称一样的值,把值设置给对象(setter方法)
//得到属性的描述器
BeanInfo b = Introspector.getBeanInfo(clz,Object.class);
PropertyDescriptor[] pds = b.getPropertyDescriptors();
for (PropertyDescriptor pd : pds) {
//得到属性的setter方法
Method setter = pd.getWriteMethod();
//得到key名字和属性名字相同的value设置给属性
setter.invoke(obj, map.get(pd.getName()));
}
return obj;
}
编程题:
1、递增数组,用二叉搜索求数字是否存在在数组中
2、若干个大数求和,偷懒了,直接用了BigDecimal,不知道这样会不会不算AC,有人知道嘛
3、查找首个在字符串中没有重复出现的字符
附加题:
将ArrayList<String>形式的参数通过以下3个步骤加密成一段token
入参数的格式为["query=中文","version=1.0.0"]这样的格式
要求:1、将入参的顺序按照key的升序排序
2、将入参拼接成k1=v1&k2=v2&k3=v3这样的格式
3、将2生成的字符串通过md5加密
注:可能有中文,md5加密结果小写
我这题还做了挺久的,因为md5加密不会,之前项目里有用到过md5,当时也是直接CtrlC+CtrlV黏贴来的,不知道加密的具体细节,最后加密的结果错了,以下是我的失败题解,希望有大佬能给个正解
//失败题解,非正解。最后加密结果错误 public String createToken(ArrayList<String> querys) { // write code here TreeMap<String, String> treeMap = querysToTreeMap(querys); String myArgs = getStringArgs(treeMap); String md5String = getMd5ByArgs(myArgs); return md5String; } private TreeMap<String, String> querysToTreeMap(ArrayList<String> querys) { TreeMap<String, String> treeMap = new TreeMap<>(); for (String s : querys) { String[] strings = s.split("="); treeMap.put(strings[0], strings[1]); } return treeMap; } private String getStringArgs(TreeMap<String, String> treeMap) { StringBuilder stringBuilder = new StringBuilder(); while (treeMap.size() != 0) { Map.Entry entry = treeMap.pollFirstEntry(); stringBuilder.append(entry.getKey() + "=" + entry.getValue() + "&"); } if (stringBuilder.length() > 0) { stringBuilder.deleteCharAt(stringBuilder.length() - 1); } return stringBuilder.toString(); } private String getMd5ByArgs(String myArgs) { String md5 = ""; try { MessageDigest md = MessageDigest.getInstance("md5"); md.update(myArgs.getBytes("utf-8")); byte b[] = md.digest(); int i; StringBuffer sb = new StringBuffer(""); for (int offset = 0; offset < b.length; offset++) { i = b[offset]; if (i < 0) i += 256; if (i < 16) sb.append("0"); sb.append(Integer.toHexString(i)); } md5 = sb.toString(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return md5; }
PS:["query=中文","version=1.0.0"]正确结果是“be614...2971”的32位字符串