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