笔试编程题整理
题目描述
代码:
function fib(n, current = 1, next = 1) {
if(n == 1) return current;
if(n == 2) return next;
return fib(n -1, next, current + next);
}
function F(n) {
if(n == 1) return 0;
if(n == 0) return 0;
let sum = 1;
let i = 2;
let caches;
while(n > sum) {
caches = fib(i++);
sum += caches;
}
return sum - caches;
}
题目描述
样例
输入:[0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1]
输出:6
代码:
function getVolumn(input){
var arr= input.map(item=>+item)
var max= Math.max.apply(null,arr);
var result=0;
for(var i=0; i< max;i++){
var tmpArr = arr.map(item=>item >= i + 1 ? 1: 0); // 逐层记录水位
var tmp = tmpArr.join('').match(/10+(?=1)/g); // match(/10+1/g)问题:对于连续的 10101 会漏掉一个水位
if (tmp) {
tmp.map(item=>result+= item.length-1); // tmp.map(item=>result+= item.length-2);
}
};
return result;
}
正则表达式 零宽断言
零宽断言就是下结论,例如 ab,正则:a(?=b),匹配 a 并且向右看是 b,得到的结果是 a,断言不会在匹配的内容当中,如果是 a(?=c),则匹配不到任何内容,因为匹配 a 以后向右看并不是 c。另外,零宽断言分两种:前瞻(Lookahead)和后顾(Lookbehind),但 JavaScript 只支持前瞻。
前瞻表达式的语法如下:
表达式 | 说明 |
---|---|
m(?=n) | 匹配后面紧接 n 的字符串 m |
m(?!n) | 匹配后面没有紧接 n 的字符串 m |
题目描述
代码:
var input = parseInt(read_line())
arr = []
function main(n) {
if (n == 0)
return
if (n % 2 == 1) {
arr.push('2')
main((n - 1) / 2)
} else {
arr.push('3')
main(n / 2 - 1)
}
}
main(input)
print(arr.reverse().join(''))
题目描述
给出html、css代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
body,
html {
margin: 0;
}
table {
border-collapse: collapse;
table-layout: fixed;
margin: 10px auto;
}
td {
border: 1px solid #E1E1E1;
padding: 0;
width: 30px;
height: 30px;
cursor: pointer;
}
.current {
background: #1D2088;
}
.wrap {
background: #00A0E9;
}
</style>
</head>
<body>
<table id="jsLayout">
<tbody>
<tr>
<td class="current"></td>
<td class="wrap"></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td class="wrap"></td>
<td class="wrap"></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</tbody>
</table>
<script>
// your code
</script>
</body>
解答:
function bind() {
var row = document.querySelectorAll('tr'); // var row = document.getElementByTagName('tr');
var rowNum = row.length;
var colNum = row[0].children.length;
for(let i = 0; i < rowNum; i++) {
for(let j = 0; j < colNum; j++) {
var currentNode = row[i].children[j];
// 循环中有异步操作 将导致闭包 这里解决办法使用 let ;还有两种解决办法见 <https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Closures>
currentNode.addEventListener('click', function (e) {
var currentRowIndex = i;
var currentColIndex = j;
for(var x = 0; x < rowNum; x++) {
for(var y = 0; y < colNum; y++) {
var node = row[x].children[y];
node.className = '';
if((currentRowIndex - x <= 1) && (currentRowIndex - x >= -1)
&& (currentColIndex - y <= 1) && (currentColIndex - y >= -1)) {
row[x].children[y].className = 'wrap';
}
}
}
row[i].children[j].className = 'current';
// currentNode.className = 'current';
// 闭包导致这里会有问题;除非声明时使用 let currentNode
});
}
}
}
bind()
题目描述
代码:
function box(arr) {
let num = 0;
while(arr.length) {
[...new Set(arr)].map((item, index) => {
arr.splice(arr.indexOf(item), 1);
});
num++;
}
return num;
}
题目描述
代码:
/**
* 班级不同,直接对班级顺序升序
* 否则,对分数进行升序
* return 0 表示相对位置不变
*/
function studentSort(arr) {
arr.sort(compareFun);
function compareFun(a, b) {
let classDiff = a.class - b.class;
let scoreDiff = a.score - b.score;
if(classDiff !== 0) return classDiff;
return scoreDiff;
}
return arr;
}
假设屏幕宽度足够, body 里生成 100 个 div, 每个 div 宽 100px,高 100px, 按红、黄、蓝、绿交替变色,10 行 10 列排列。
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<style>
* {
margin: 0;
padding: 0;
}
body {
width: 1000px;
display: flex;
flex-wrap: wrap; /* 换行 */
}
.item {
width: 100px;
height: 100px;
display: inline-flex;
background-color: blue;
}
.item:nth-of-type(3n+1) { /* 注意和nth-child的区别 */
background-color: red;
}
.item:nth-of-type(3n+2) {
background-color: yellow;
}
</style>
<body>
</body>
<script>
var fragment = document.createDocumentFragment();
for(let i = 0; i < 100; i++) {
let div = document.createElement('div');
div.className = 'item';
div.innerHTML = i + 1;
fragment.appendChild(div);
}
document.body.appendChild(fragment);
// Object.keys(Array(100).fill(0)).map((item, index) => {
// let div = document.createElement('div');
// div.className = 'item';
// fragment.appendChild(div);
// });
</script>
</html>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: JavaScript 易错的小题目
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论