美团前端笔试编程题解析
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(' '))
} 总的来说,前端编程题还是考得比较简单,没啥难度。。。。

海康威视公司福利 1160人发布