记一次阿里在线笔试(整理规划重做)

2018-09-18    

//评测题目:

题目1如图( https: //img.alicdn.com/tfs/TB12n1xbwMPMeJjy1XbXXcwxVXa-630-110.png),区域container的总宽度为100%,内部有三个 div,column1宽度是400px,column2和 column3宽度相同。请补充CSS3来实现基于以下dom结构的布局。 已知的Dom结构:

<style>
    .container{
    	width: 100%;
    	display: flex;
    }
    .container .column:first-child{
    	flex: 0 0 400px;
    }
    .column{
    	flex-grow: 1;
    	border: 1px solid;
    }
</style>
<div class="container">
    <div class="column">column1</div>
    <div class="column">column2</div>
    <div class="column">column3</div>
</div>

题目2 使用ES6的Promise对象优化下面代码:

var fs = require('fs');
fs.readFile('sample01.txt', 'utf8', function(err, data) {
	fs.readFile('sample02.txt', 'utf8', function(err, data) {
		fs.readFile('sample03.txt', 'utf8', function(err, data) {});
	});
});

/////////////////

(function() {
	var fs = require('fs');
	function readFile(name, code) {
		return new Promise(function(resolve,reject) {//返回Promise
				fs.readFile(name, code, function(err, data) {
					if (err) {//失败
						reject(err);
					} else {//成功
						resolve(data);
					}
				})
			}
		);
	}
	readFile('sample01.txt', 'utf8').then(function(data){return readFile('sample02.txt', 'utf8')})
	.then(function(data){return readFile('sample03.txt', 'utf8')}).catch(function(err){})
	/*var promiseList = [readFile('sample01.txt', 'utf8'), readFile('sample02.txt', 'utf8'), readFile('sample03.txt', 'utf8')];
	Promise.all(promiseList).then(function(data) {
		//todo
	}).catch(function(err){
		//error
	})*/
}())

题目3 有一段文本它的内容是: var text = “内容文字…”, 文本中包含部分敏感词汇, 如[“86学潮”, “萨德”, “中共”]。 请编写函数查找到这些敏感词, 并将其字体颜色更改为红色。

(function(){
	/**
	 * blackList 黑名单列表 eg:["86学潮", "萨德", "中共"]
	 * text 要替换的文本 eg:"86学潮的撒打算是萨德大扫荡撒萨德的鞍山打中共的飞洒是 鞍山都是86学潮的撒打算是萨德大扫荡撒萨德的鞍山打中共的飞洒是"
	 * @return 
	 */
	var replace = function(text,blackList) {
		if(text&&(blackList instanceof Array)&&(blackList.length>0)){
			//创建正则表达式。匹配黑名单中的词,存在或者存在多个
			var reg = new RegExp("(" + blackList.join("|") + ")\1*", "g");
			//进行替换,在原词组上加上红色字体标签
			return text.replace(reg, function($, $1) {
				return "<span style='color:red'>" + $1 + "</span>"
			})
		}else{
			return text;
		}

	}
	var text = "86学潮的撒打算是萨德大扫荡撒萨德的鞍山打中共的飞洒是 鞍山都是86学潮的撒打算是萨德大扫荡撒萨德的鞍山打中共的飞洒是";
	var blackList = ["86学潮", "萨德", "中共"];
	console.log(replace(text,blackList))
}())

题目4 给 Array 对象增加一个原型方法, 用于删除数组条目中重复的条目(可能有多个), 返回值是一个包含被删除的重复条目的新数组。

(function(){
	Array.prototype.uniqueByFilter = function() {
		//只取第一次出现的位置
		return this.filter(function(item, index, arr) {
			return index === arr.indexOf(item)
		})
	}
	Array.prototype.uniqueBySet = function() {
		//利用ES6中Set的唯一性
		return Array.from(new Set(this));
	}
	console.log([1,2,2,3,4,4,5,6,5].uniqueByFilter());
	console.log([1,2,2,3,4,4,5,6,5].uniqueBySet());
}())

题目5 实现一个函数 sort, 要求 // 输入: // { // “ng”: 100, // “react”: 200, // “vue”: 150 // } // 输出: // [ // {“name”: “ng”, “value”: 100}, // {“name”: “vue”, “value”: 150}, // {“name”: “react”, “value”: 200} // ]

(function(){
	function sort(obj) {
		var arr = [];
		for (var name in obj) {//先将对象转数组
			arr.push({
				name: name,
				value: obj[name]
			})
		}
		return arr.sort(function(a, b) {//进行排序
			return a.value - b.value
		})
	}
	var obj = {
		"ng": 100,
		"react": 200,
		"vue": 150
	 }
	console.log(sort(obj))
}())

题目7 实现reduce方法

	Array.prototype.reduce = function(fn,initValue){
		 var sum = initValue||0;
		 for(var i = 0;i<this.length;i++){
			 sum = fn.call(this,sum,this[i],i,this);			 
		 }
		 return sum;
	 }	

题目7 找出一段字符串中最长的回文

	var getMaxPalindrome = (function(){
		function isPalindrome(str){//判断是否是回文
			return str.length>1 && str === (str.split("").reverse()).join("");
		};
		function getStr(str,fn){//依次截取字符串,进行操作
			for(var i =1;i<str.length+1;i++){
				fn(str.substr(0,i))
			}
		}
		function _getMaxPalindrome(str){
			if(str.length<2){//如果字符串长度不足2,则不存在回文
				return null;
			}else if(isPalindrome(str)){//如果字符串整体直接就是回文,那就他本身肯定就是最长的回文
				return str;
			}
			var max = "";//存放最长回文
			for(var i =0;i<str.length;i++){
				getStr(str.substr(i),function(_str){//获取所有字符串组合情况
					if(isPalindrome(_str)&&_str.length>max.length){//判断是否为回文,并且是否大于之前最大的回文
						max = _str;//如果满足条件,则最大回文为当前值
					}
				})
			}
			return max?max:null;
		}
		return _getMaxPalindrome;
	})()
	console.log(getMaxPalindrome("123321123321111333222"))