正题就是:电商go语言职位笔试题答案。为什么标题是这个,我也不知道呀!
【拼装n个m大小的字符串数组的字符串组合】(详细业务见下方代码注释)
有递归的方式(递归太挑使用场合了,用的不好我怕挨打,所以不写就不会挨打)
嵌套循环的方式(面试官说要ijk变量临时加加减减,判断来来回回,我也许要半天才能实现但是我觉得是浪费时间)
这里介绍我的拆分方法(就是将大问题拆解为简单的局部问题,粗暴相加)。
该实现自我标榜的优点是:
1,可以改成多线程,或者分布式节点执行,以此支持大数据量的拆分并发计算,中间值的存储可以更加丰富,不会出现栈溢出,如字符串加到一定体量,可以改为存到数据库,数组下标里存记录id,最终输出时根据id串联输出,规避内存占用大的缺点。
2,除了扩展性,最最突出的莫过于实现简单易懂。只要记住分而治之(当然下方可能没有实现这个逻辑但有这个核心),n*m都转换成两两相加,这个实现起来毫不费力,怎么写都不会错。分而治之的思想也是拆解常见问题的方式。
那,总结起来就是:简单可爱,不信就往下看:
import java.util.ArrayList;
import java.util.List;
/**
* 组装数组 </br>
* 拼装n个m大小的数组的字符串组合</br>
* 即每个数组中选取一个元素,组成字符串的个数,比如以下main中的组合是3*3*3*4=108 </br>
* 如 a11,a21,a31,an1 ... a13,a22,a31,anm ... a13,a23,a33,anm </br>
*/
public class ArrayMaker {
public static void main(String[] args) {
//构造数据源
String[] ary1 = new String[]{"a11","a12","a13"};
String[] ary2 = new String[]{"a21","a22","a23"};
String[] ary3 = new String[]{"a31","a32","a33"};
String[] aryn = new String[]{"an1","an2","an3","anm"};
List<String[]> list = new ArrayList<String[]>();
list.add(ary1);
list.add(ary2);
list.add(ary3);
list.add(aryn);
//按照规则,开始合并生成字符串数组
//只有一个线程,就简单的二个值累加一下吧,
//真的拆分要先切分数据源,体现出拆分,再到结果的分布式合并。
//直接强硬地取初始值
String[] ary = list.get(0);
for(int idx=1;idx<list.size();idx++){
ary = plusArray(ary,list.get(idx));
}
//打印结果
for(String str : ary){
System.out.println(str);
}
//核对下总数是否是 ary1.length 一直乘以到 aryn.length
System.out.println(ary.length);
}
//合二为一
public static String[] plusArray(String[] ary,String[] aryAnother){
if(aryAnother==null){
return ary;
}
String[] aryPlus = new String[ary.length*aryAnother.length];
StringBuffer sbf = new StringBuffer();
int idx = 0;
for(String str : ary){
for(String strAnother : aryAnother){
sbf.append(str).append(",").append(strAnother);
aryPlus[idx]= sbf.toString();
System.out.println(sbf);
idx ++;
sbf = new StringBuffer();
}
}
return aryPlus;
}
}
下方吐槽,君可旁观
近日,面试了几下,那些个题目,搞得我摸不准,不是因为难,说是简单可我也没答对呀,真是尴尬,为了缓解淡淡的忧伤,所以我就写文章吐槽。。。。。。。
比如,哪些走索引(然后列出了一些where 条件判断),无非就是考察sql怎么写高效,能看懂执行计划,知道高效的写法其实也就差不多了,至于那些千奇百怪的写法小心要请挖掘机来填。
比如,String的各种初始化,反反复复赋值来来回回变着花样初始化,问你一共产生了多少个对象。估计大多数人都只有模糊的规则,比如:什么时候堆中创建了两个字符串值,什么时候是指向的同一个。
各种父子类,相互赋值,变着花样初始化,调用父子类的同名方法,问你输出什么。
有一个大事务里面,多个方法,同步的,异步的,远程的,问你开启了多少个数据库连接。我还真的答错了,因为我从未见过这样的代码。最后告诉我,事务不要这样写,这好像是我的台词。
以上,要是我们组内开发真的写这样那样千奇百怪的代码,先批评,再问他什么是主流的普通的实现,什么又是优雅的实现。然后大家写一样风格的代码然后一起迭代到更优雅的实现,这也是天下间所有程序员的追求,走大路开大船住大house赚大票子。
好,说的是流程制度和题目本身,人其实都还挺好的,面试双方各种情况都有,十之八九都是过眼云烟,有些还挺乐呵。
如果还有奇怪的代码,先问他java是值传递还是引用传递,然后问他php和java哪个好,go和scala哪个好。其实以上这些问题最常见于上个10年里的线下java培训班,归根结底也不是我要吐槽,是最近有同事笔试面试,以我代他们吐槽。
网友评论