阅文集团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位字符串