1.数值的正数次方
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
保证base和exponent不同时为0
我的解法
Math.pow(x,y)??
function Power(base, exponent)
{
let r = 1
while(exponent--){
r*=base
}
return r
}
其他分析
上面做法肯定不行,就去看题解了。求幂次方也能玩出花。。。
快速幂
百度百科中描述直观一些,如下图
也就是说计算a的11次方,只要计算a的1次方、a的2次方和a的8次方,再相乘就行了。我们需要找到幂的二进制表达中为1的位
流程
-
数exponent移位到为0时,停止循环
- 当
exponent & 1 == 0
时,res = res*x
x = x*x
- 数exponet右移一位
- 当
function Power(base, exponent)
{
let res = 1
let n
if(exponent==0){
return 1
}else if(exponent<0){ //指数为负
n = -exponent
}else{
n = exponent
}
while(n){
if(n&1){
res *=base
}
base *=base //这里注意!!!
n = n >>1
}
return exponent>0 ? res:1/res
}
2.调整数组顺序使奇数位于偶数前面
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
我的解法
一开始的想法:遍历数组,遇到偶数就删掉然后从数组末尾push进去。
但是!如果数组末尾都是奇数,也就是说还没遍历完数组,所有的偶数都已经push进末尾了,再接着循环就破坏偶数的顺序了。
function reOrderArray(array) //错错错
{
for(let i = 0;i<array.length;i++){
if(array[i]%2 ==0){
let tmp = array[i]
array.splice(i,1)
array.push(tmp)
}
}
return array
}
又想了一个办法:遍历数组把偶数都放进一个空数组,然后把空数组与原数组拼接。
但是!遇到连续偶数的时候,删了前面的偶数后面的偶数顶上,应该继续留在这一位处理,但是i++了,就跳过了一个偶数
function reOrderArray(array) //错错错
{
let arr = []
for(let i = 0;i<array.length;i++){ //循环出问题了
if(array[i]%2 ==0){
let tmp = array[i]
array.splice(i,1)
arr.push(tmp)
}
}
return array.concat(arr)
}
终极笨办法:两个空数组,一个放奇数,一个放偶数。遍历完了之后,拼接俩数组。
function reOrderArray(array) //对了
{
let arr1 = []
let arr2 = []
for(let i = 0;i<array.length;i++){
if(array[i]%2 ==0){
arr2.push(array[i])
}else{
arr1.push(array[i])
}
}
return arr1.concat(arr2)
}
其实之前两个办法出问题的原因就是,数组遍历的时候还改了原数组,那么一位一位遍历的时候就会出错。