《剑指Offer》-09代码的完整性

数值的整数次方

题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
保证base和exponent不同时为0

方法一:调用幂函数

1
2
3
4
5
function Power(base, exponent)
{
// write code here
return Math.pow(base,exponent);
}

方法二:快速幂

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
function Power(base, exponent)
{
// write code here
var res=1,
curr=base,
n;
if(exponent>0){
n=exponent;
}
else if(exponent===0){
return 1; //任何数的0次方为1
}
else{
if(base===0){
throw new Error('base不能为0');//底数不能为0
}
n=-exponent;
}
while(n!==0){
if(n&1===1){
res*=curr
}
curr*=curr;//每右移一位,数值翻倍
n=n>>>1; //右移
}
return exponent>=0?res:(1/res);
}

总结(参考自牛客网推荐题解):

  1. 全面考察指数的正负、底数是否为零等情况
  2. 写出指数的二进制表达,例如13表达为二进制1101
  3. 举例:10^1101 = 10^0001*10^0100*10^1000
  4. 通过&1和>>1来逐位读取1101,为1时将该位代表的乘数累乘到最终结果

调整数组顺序使奇数位于偶数前面

题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function reOrderArray(array)
{
// write code here
var arr=[];
for(var i=0;i<array.length;i++){
if((array[i] & 1)===1){
arr.push(array[i]);
}
}
for(var j=0;j<array.length;j++){
if((array[j] & 1)!==1){
arr.push(array[j]);
}
}
return arr;
}

另一种近似的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function reOrderArray(array)
{
// write code here
var arr1=[];
var arr2=[];
for(var i=0;i<array.length;i++){
if((array[i] & 1)===1){
arr1.push(array[i]);
}
}
for(var j=0;j<array.length;j++){
if((array[j] & 1)!==1){
arr2.push(array[j]);
}
}
return arr1.concat(arr2);
}

总结:
concat()
方法concat() 方法用于连接两个或多个数组。该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。
将数值与1进行与(&)运算,若结果为1则表明该数二进制最低位为1,则计数+1,否则最低位为0;将该数进行无符号右移(>>>)

0%