Rychou'blog

面试题收集

2018-11-25

1. 实现一个函数,判断输入是不是回文字符串.

回文字符串:顺着读和反着读是一样的。如:noon

1
2
3
4
5
6
7
8
9
function run(input) {
if (typeof input !== 'string') return false
return (
input
.split('')
.reverse()
.join('') === input
)
}
  • split拆分字符串,返回数组。
  • reverse将字符串倒序。
  • joinsplit作用相反,将数组转换成字符串。

2. 实现已知或者未知宽度的垂直水平居中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/* 方法一 */
.wraper {
position: relative;
}
.wraper .box {
position: absolute;
top: 50%;
left: 50%;
width: 100px;
height: 100px;
margin: -50px 0 0 -50px;
}

/* 方法二 */
.wraper {
position: relative;
}
.wraper .box {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}

/* 方法三 */
.wraper.box {
display: flex;
justify-content: center;
align-items: center;
height: 100px;
}

/* 方法四 */

.wraper {
display: table;
}
.wraper .box {
display: table-cell;
vertical-align: middle;
}

3. 请简单实现双向数据绑定 mvvm

1
<input id="input" />
1
2
3
4
5
6
7
8
9
10
11
const data = {}
const input = document.getElementById('input')
Object.defineProperty(data, 'text', {
set(value) {
input.value = value
this.value = value
}
})
input.onChange = function(e) {
data.text = e.target.value
}

参考:Object.defineProperty

4. isPrime-判断质数

1
2
3
4
5
6
7
8
function isPrime(num) {
for (let i = 0; i < num; i++) {
if (num % i === 0) {
return false
}
}
return true
}

5. factorial-求阶乘

1
2
3
4
5
6
7
8
9
10
11
function factorial(num) {
var count = 1
for (let i = num; i > 0; i--) {
count *= i
}
return count
}

function factorial2(num){
return num === 1 ? 1 : factorial2(num-1) * num
}

6. fib - 返回斐波那契数

斐波那契数: F0=0, F1=1, Fn=Fn-1+Fn-2

最简单的写法,但是效率低,会有很多重复运算。

1
2
3
function fib(n) {
return n === 0 || n === 1 ? n : fib(n - 1) + fib(n - 2)
}

高效写法:

1.把计算过的结果保存缓存起来,避免重复计算

1
2
3
4
5
6
7
8
9
let fib = (function() {
let memory = []
return function(n) {
if (memory[n]) {
return memory[n]
}
return memory[n] = n === 0 || n === 1 ? n : fib(n - 1) + fib(n - 2)
}
})()

2.尾调用优化

1
2
3
4
5
6
7
8
9
10
11
function Fibonacci2(n, ac1 = 1, ac2 = 1) {
if (n <= 1) {
return ac2
}

return Fibonacci2(n - 1, ac2, ac1 + ac2)
}

Fibonacci2(100) // 573147844013817200000
Fibonacci2(1000) // 7.0330367711422765e+208
Fibonacci2(10000) // Infinity

7. filter - 实现filter函数

1
2
3
4
5
6
7
8
9
10
11
function filter(arr, fn) {
var array = []
for (var i = 0; i < arr.length; i++) {
if (fn(arr[i])) {
array.push(arr[i])
}
}
return array
}

filter([1, 2, 3, 4, 6, 10, 17], n => n > 0 && isPrime(n)) //[1,2,3,17]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function $initHighlight(block, cls) {
try {
if (cls.search(/\bno\-highlight\b/) != -1)
return process(block, true, 0x0F) +
` class="${cls}"`;
} catch (e) {
/* handle exception */
}
for (var i = 0 / 2; i < classes.length; i++) {
if (checkCondition(classes[i]) === undefined)
console.log('undefined');
}
}

export $initHighlight;

8. 代码回收规则

  • 全局变量不会被回收。
  • 局部变量会被回收,也就是函数一旦运行完以后,函数内部的东西都会被销毁。
  • 只要被另外一个作用域所引用就不会被回收

9. 杨辉三角

Fm n = Fm-1 n + Fm-1 n-1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function print(n){
for(let i = 1; i<=n; i++){
let arr = [];
for(let j = 1; j<=i; j++){
arr.push(getNum(i,j))
}
console.log(arr.join(' '))
}
}

function getNum(m, n){
if( m === 1 || n === 1 || m === n){ // 第一行只有一个数——1,其他行第一个元素和最后一个元素为1
return 1;
}
return getNum(m-1, n) + getNum(m-1, n-1)
}

10. new命令执行过程

参考:new命令原理

  • 创建一个空对象,作为将要返回的对象实例。
  • 将这个空对象的原型,指向构造函数的prototype属性。
  • 将这个空对象赋值给函数内部的this关键字。
  • 开始执行构造函数内部的代码。

如果构造函数内部return了一个对象,则在new时会返回指定的对象。如果return不是一个对象,则与正常的new一样。

Tags: 面试
使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏