携程web前端秋招笔试编程题(用js实现一个函数,能使输入特定的字符串转化为特定结构化数据)

笔试题:用js实现一个函数,能使输入特定的字符串转化为特定结构化数据。(该题与阿里笔试题编程题之一一样)

字符串仅由小写字母和[,]构成,且字符串不包含多余的空格(阿里的提示,携程没有)

示例一:‘abc’->{value:'abc'}

示例二:‘[abc[bcd[def]]]’->{value:'abc',children:{value:'bcd',children:{value:'def'}}}

思路(我的):

1.上面很明显的给出了两个不同类型的字符串,所以输出的结果需分成两类;

2.主要考点集中在第二种,第二种字符串输出的形式可以看出,要输出一种树形结构对象;

3.要想输出树形结构对象,如果按照顺序来思考的话,会进入一个逻辑复杂度很高的循环里,所以该题应该先输出最末端的一个树枝末梢,也就是树形结构对象里面最内层的子对象:{value:'def'},然后再逐次向外扩张,也就是一个类似递归的过程。

代码实现:

function normalize(str){
	var obj = {};
	if(str.indexOf('[') == -1){				  //判断两种字符串,并分别处理
		obj.value = str;
		return obj;
	}else{
		var parts = str.split('[');
		parts.shift();						  //生成的数组中,第一个元素为空,需删除
		var len = parts.length;
		obj.value = parts[len-1].slice(0,len);//最小的子类对象出现
		parts.pop();						  //删除数组最后一个元素,它比较特殊,所以特殊处理
		for(var i=parts.length-1;i>=0;i--){	  //把剩余的循环“递归”
			obj = handleArr(parts,obj);
			parts.pop();
		}
		return obj;
	}
}

function handleArr(arr,obj){
	var o = {};
	var len = arr.length;
	o.value = arr[arr.length-1];
	o.children = obj;
	return o;
}

console.log(normalize('abc'))
console.log(normalize('[abc[bcd[def]]]'))

最终输出效果如下图:

携程web前端秋招笔试编程题(用js实现一个函数,能使输入特定的字符串转化为特定结构化数据)_第1张图片

当然了,个人觉得这个实现可能并不能满足所有的输入情况,但是在笔试中,利用二十分钟的时间去实现这个基础要求应该是足够了,毕竟笔试时间也就60分钟。

PS:如果大家有更好更全的方法,欢迎评论交流~ 

你可能感兴趣的:(算法)