前天参加了一下去哪儿校园招聘的面试,光荣的在第一面就挂了,虽然面试我的是重大计算机的已毕业学生。本来吧,其实都没想过通过笔试环节的,但是面试也还是挂在了笔试的那一堆题目中,这两天就好好研究了一下,稍作总结于此。
一、 题目中给了一个表格,里边是父母双亲的血型以及对应的子女可能出现的血型,要求用JavaScript实现功能:根据父母血型判断子女可能出现的血型;根据父母以及子女的血型判断子女是否为亲生。
这个类型最基本的写法就是if-else,我也知道当if-else多了的时候可以使用switch-case来替代,但是当case多了的时候我就不知道使用哈希表来解决了。这应该是面试挂掉的一个挂点吧,因为面试官提醒说用哈希表来解决一下,可是,我的确不知道,也当场实现不了。下面附上这两天的学习结果吧,使用JavaScript实现针对此问题的哈希表:
function HashTable(){
this.table = new Array(137);
this.simpleHash = simpleHash;
this.showDistro = showDistro;
this.put = put;
this.get = get;
}
function put(parentType,childPossible,childImpossible){
var pos = this.simpleHash(parentType);
this.table[pos] = {};
this.table[pos]['childPossible'] = childPossible;
this.table[pos]['childImpossible'] = childImpossible;
}
function get(parentType,childType){
if(childType === undefined){
return this.table[this.simpleHash(parentType)]['childPossible'];
}else{
var index = this.table[this.simpleHash(parentType)]['childPossible'].indexOf(childType);
if(index == -1){
return '您的孩子可能不是亲生的';
}else{
return '您的孩子是亲生的';
}
}
}
function simpleHash(parentType){
var total = 0;
for(var i=0; i<parentType.length; ++i){
total += parentType.charCodeAt(i);
}
return total % this.table.length;
}
function showDistro(){
var n=0;
for(var i=0; i < this.table.length; ++i){
if(this.table[i] != undefined){
console.log(i + ': ' + this.table[i]['childPossible'] + ' + ' + this.table[i]['childImpossible']);
}
}
}
var hTable = new HashTable();
hTable.put('O,O','O','A,B,AB');
hTable.put('A,O','A,O','B,AB');
hTable.put('A,A','A,O','B,AB');
hTable.put('A,B','A,B,AB,O','————');
hTable.put('A,AB','A,B,AB','O');
hTable.put('B,O','A,O','A,AB');
hTable.put('B,B','B,O','A,AB');
hTable.put('B,AB','A,B,AB','O');
hTable.put('AB,O','A,B','O,AB');
hTable.put('AB,AB','A,B,AB','O');
hTable.showDistro();
二、占位符替换问题,这个倒是没什么问题,实现的方式可以有很多,贴一个结果mark一下,和原题稍有差别,原题容易被误解为对象key-value匹配:
var str = 'af%sffio%sbfas%sfds%sjj%sf';
var arr = ['中国','美国','俄罗斯','英国','法国','德国','瑞典'];
function placeholder(str,arr){
var strLen = str.match(/%s/g).length,
arrLen = arr.length;
if(strLen < arrLen){
var tempArr1 = [], tempArr2 = [];
for(var i=strLen-1; i<arrLen;i++){
tempArr1.push(arr[i]);
}
for(var j=0;j<strLen-1;j++){
tempArr2.push(arr[j]);
}
tempArr2.push(tempArr1);
arr = tempArr2;
}else if(strLen > arrLen){
for(var k=arrLen; k<strLen; k++){
arr.push('null');
}
}
var strArr = str.split('%s');
var result = [];
for(var h=0;h<arr.length;h++){
result.push(strArr[h]);
result.push(arr[h]);
}
result.push(strArr[strArr.length-1]);
console.log(result.join(''));
}
placeholder(str,arr);
三、操作系统的一些东西懂吗?至于我的回答肯定是:xxx,这也是一个挂点吧。
四、聊点关于前端其他的吧,讲一下盒模型吧,“blablabla……”;再说一下事件吧,“blablabla……”;这些你都是自己体会到的还是看书记下来的(从眼神中感觉他是觉得我在背课本),“blablabla……”;谈谈你对前端工程化的理解吧,“blablabla……”,这里应该也是一个挂点。。
五、其余的就都是穿插了一些其他问题,比如自动化专业都学哪些课程啊,为什么从重庆来到西安找工作了呀,都面试过哪几家其他单位了呀,它的笔试题目和我们的有什么区别呀。
六、你有什么需要问我的,“blablabla……”,有的人实践强,但是没有理论基础,有的人基础厉害,但是没有过实践,建议你回去好好学学数据结构等计算机基础课程。
结果:挂掉。
附录:这两天学习过程中使用JavaScript实现的采用循环链表解决约瑟夫问题(代码组织待优化):
function Node(element,index){
this.index = index;
this.element = element;
this.next = null;
}
function List(element,index){
this.head = new Node(element,index);
this.head.next = this.head;
this.insert = insert;
this.find = find;
this.remove = remove;
this.findPrevious = findPrevious;
this.display = display;
}
function find(element){
var currNode = this.head;
while(currNode.element != element){
currNode = currNode.next;
}
return currNode;
}
function insert(newelement,element,index){
var newNode = new Node(newelement,index);
var currNode = this.find(element);
newNode.next = currNode.next;
currNode.next = newNode;
}
function findPrevious(element){
var currNode = this.head;
while(currNode.next.element != element){
currNode = currNode.next;
}
return currNode;
}
function remove(element){
var prevNode = this.findPrevious(element);
prevNode.next = prevNode.next.next;
}
function display(){
var currNode = this.head;
while((currNode.next != this.head) && (currNode.next != currNode)){
console.log(currNode.element + '\n');
currNode = currNode.next;
}
console.log(currNode.element);
}
var nameList = ['A','B','C','D','E','F','G','H','I','J'];
var loopList = new List(nameList[0],1);
for(var i=1; i<nameList.length; i++){
loopList.insert(nameList[i],nameList[i-1],i+1);
}
var currNode = loopList.head;
for(var j=1;j<4;j++){
currNode = currNode.next;
if(j == 3){
if(currNode.next != currNode){
loopList.remove(currNode.element);
j = -1;
}else{
console.log(currNode.element);
break;
}
}
}