盒子
盒子

记一次面试题目

题目:请在屏幕打印2的10000次方。

解题思路:
1、双精度,存不下。
2、寻找规律与数据存储方式
[2],[4],[8],[16],[32],[64],[128]…
[2],[4],[8],[61],[23],[46],[924]…
会有规律如:[61]=>[23] 62=12取个位进一留给12相加,得出[23]

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
function print(n){
var arr = [2];
var t = 0;
var plus = 0;
var nextNum;
for(var i = 0; i <= n; i++){
var len = arr.length;
plus = 0;
if(i <= 1){
continue;
}
for(var j = 0; j < len; j++){
t = arr[j]*2 + plus;
// 判断是否需要进位
if(t >= 10){
arr[j] = t.toString().charAt(1);
if(!arr[j + 1]){
arr.push(t.toString().charAt(0))
}else{
// 记录进位数字
plus = parseInt(t.toString().charAt(0))
}
} else {
plus = 0;
arr[j] = t;
}
}
}
return arr.reverse().join('');
}

题目:有5个人,分50个宝石,从1号开始分,,每个人都根据自己利益来投票,每一轮投票>50%才能通过,否则1号淘汰,2号继续。问1号怎么分才能对自己最有利

回答: 从4、5号开始往前推导。

题目:打印螺旋循环数字,输入多少打印到多少。
如:
7,8,9
6,1,2
5,4,3

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
function RotateNumber (argument) {
this.print(300)
}
RotateNumber.prototype = {
state: 'push',
print : function (n){
//var n = 100;
var arr1 = this.handleArr([], 1,n);
// fill " " to print fomatter;
var arr = this.handleArr(arr1, n + 1, this.findMinLenCount(arr1) + n , " ");
var str = '';
for (var i = 0; i < arr.length; i++){
str += arr[i].toString() + '\n';
}
console.log(str);
},
fillNum : function(len,num){
var arr = num.toString().split('')
for(var i = 0;i< len - num.toString().length; i++){
arr.unshift(' ');
}
return arr.join('');
},
findMinLenIndex : function(arr, preMinLenIndex){
var minLen = arr[0].length;
var minIndex = 0;
var isAllLenEqual = this.isAllLenEqual(arr);
var isAsc = this.isArrLenAsc(arr);
if(isAllLenEqual){
// 全部行数相同,返回上一次记录的最小长度所在下标
return preMinLenIndex;
}else{
for(var i = 0; i < arr.length; i++){
// 数组没个元素长度升序
if(isAsc){
if(minLen >= arr[i].length){
minLen = arr[i].length;
minIndex = i;
}
}else{
if(minLen > arr[i].length){
minLen = arr[i].length;
minIndex = i;
}
}
}
return minIndex;
}
},
/*
* arr [] 已有数组
* s 数组开始数字
* n 数组结束数字
* fill 填充内容,默认为数字
*/
handleArr : function (arr, s, n, fill){
arr = arr || [];
var tempArr;// new row array
var minLenIndex = 0;
var numLen = n.toString().length;
for(var i = s; i <= n; i++){
tempArr = [];
if(arr.length <= 0){
tempArr.push(this.fillNum(numLen,i));
arr.push(tempArr);
} else {
// 找到最小长度数组,进行插入操作
minLenIndex = this.findMinLenIndex(arr, minLenIndex);
// 关键判断,当最小数组的长度大于容器数组长度时,说明容器周边填充完毕,需要新增一行,并且前后插入是交替操作的
if(arr[minLenIndex].length > arr.length){
tempArr.push(fill || this.fillNum(numLen,i));
arr[this.state](tempArr);
this.state = this.state == 'push' ? 'unshift' : 'push';
}else{
arr[minLenIndex][this.state](fill || this.fillNum(numLen,i));
}
}
}
return arr;
},
findMinLenCount : function (arr){
var isAllLenEqual = this.isAllLenEqual(arr);
var minLen = this.getMinLen(arr);
var count = 0;
if(isAllLenEqual){
return count;
} else {
for (var i = 0; i < arr.length; i++){
if(minLen == arr[i].length){
count++;
}
}
return count;
}
},
isAllLenEqual : function(arr){
return arr[0].length == arr[arr.length - 1].length;
},
getMinLen: function(arr){
return Math.min(arr[0].length, arr[arr.length - 1].length);
},
isArrLenAsc: function(arr){
return arr[0].length < arr[arr.length - 1].length;
}
};
new RotateNumber()

题目证明:0.99999…. == 1

分数法:
0.333…=1/3
30.333…=31/3=1
0.999…=1

代数法:
c=0.999…
10c=9.999…
10c-c=9.999…-0.999…
9c=9
c=1

实解析-无穷等比数列:
0.999…=9(1/10)+9(1/10)^2+9(1/10)^3+…=9(1/10)/(1-1/10)=1