美团前端笔试编程题解析

1.密码匹配
这题很easy的,一看就懂。。。直接上代码吧,AC了!
var n = read_line() - 0
while (n--) {
	var str = read_line()
	if (!/^[a-zA-Z0-9]+$/.test(str)) {
		print('NO')
	} else if (str.length < 8) {
		print('NO')
	} else if (/^[\d]$/.test(str[0])) {
		print('NO')
	} else {
		var countA = 0,
			counta = 0,
			count0 = 0
		for (var i = 0; i < str.length; i++) {
			if (str[i] >= 'A' && str[i] <= 'Z') countA++;
			if (str[i] >= 'a' && str[i] <= 'z') counta++;
			if (str[i] >= 0 && str[i] <= 9) count0++;
		}
		var count = 0;
		if (countA > 0) count++;
		if (counta > 0) count++;
		if (count0 > 0) count++;
		if (count >= 2) print('YES')
		else print('NO')
	}
}
2. 交换数字
题意是:0-n ,n个数,找其中两个数并交换,且只能交换一次,要使得交换后的数字最小。
思路:遍历这个n个数,然后找到降序排列里的最小的数字 X,例如:4 5 2 7 6 1,这里5->2,7->6,6->1都是降序的,最小的降序排列里的数字是1,所以X就是1,然后将X和它前面的数依次比较,如果X更小,则继续往前比较,直到找到第一个比X小的数Y,我们将Y后面的那一个数假定为Z,那么就只需要将X和Z交换即可。。。在这里1都要比它前面的数小,所以1就和第一个数交换了。
再看一个例子:4 5 7 8  6 ,这里的X是6,Z是7,所以X和Z交换就得到4 5 6 8 7。
AC代码如下:
var n = read_line() - 0
var str = read_line().split(' ').map(function(item) {
	return item - 0
})
var arr = [] //保存降序排列的数字
for (var i = 0; i < n - 1; i++) {
	if (str[i + 1] < str[i]) { //降序
		arr.push({
			k: i + 1, //下标
			v: str[i + 1] //值
		})
	}
}
arr.sort(function(a, b) { //升序排列
	return a.v - b.v
})
if (arr.length == 0) { //长度为0,说明那n个数是一直升序的,那么就不需要交换,直接输出就好了
	print(str.join(' '))
} else {
	var minKey = arr[0].k
	var minValue = arr[0].v //这个就是上面说到的最小的X了

	var i = minKey - 1
	while (str[i] > minValue) {
		i-- //往前找
	}
	var temp = str[i + 1] //这个数就是上面说到的Z了
	str[i + 1] = minValue
	str[minKey] = temp
	print(str.join(' '))
}
总的来说,前端编程题还是考得比较简单,没啥难度。。。。


全部评论

相关推荐

点赞 12 评论
分享
牛客网
牛客企业服务