50. Pow(x, n)
实现 pow(x, n) ,即计算 x 的 n 次幂函数。
示例 1:
输入: 2.00000, 10
输出: 1024.00000
示例 2:
输入: 2.10000, 3
输出: 9.26100
示例 3:
输入: 2.00000, -2
输出: 0.25000
解释: 2^(-2) = 1/(2^2) = 1/4 = 0.25
说明:
-100.0 < x < 100.0
n 是 32 位有符号整数,其数值范围是 [−231, 231 − 1] 。
分析:
折半计算,每次计算将n值缩小一半,若n是偶数,将x的平方积累到x中,若n是奇数,res的结果乘以x,
n的值可能为正数,负数,因此结束条件应为n是0时结束, n为正数返回res,负数时返回res的倒数。
代码:
public class LeecodeTest {
public static void main(String[] args) {
Solution So = new Solution();
double x = 2.00000;
int n = -2147483648;
System.out.println(So.myPow(x, n));
}
}
class Solution {
public double myPow(double x, int n) {
double res = 1.0;
for(int i=n; i!=0; i/=2){
if(i%2 != 0){
res *= x;
}
x*=x;
}
return n>0 ? res : (1.0/res);
}
}
905. 按奇偶排序数组
给定一个非负整数数组 A,返回一个由 A 的所有偶数元素组成的数组,后面跟 A 的所有奇数元素。
你可以返回满足此条件的任何数组作为答案。
示例:
输入:[3,1,2,4]
输出:[2,4,3,1]
输出 [4,2,3,1],[2,4,1,3] 和 [4,2,1,3] 也会被接受。
提示:
1 <= A.length <= 5000
0 <= A[i] <= 5000
分析:
优化前:
k表示排完后偶数的索引,初始为0,指针i遍历数组A,遇到偶数,
将索引为k到i-1之间的数全部后移一位,索引为i的数放在索引为k的位置上,
并且k自增1,完毕后返回数组A。
因为需要大量移动,效率较慢。优化后:
k表示排完后偶数的索引,初始为0,指针i遍历数组A,遇到偶数,
只需要将索引为k的数与索引为i的数交换,
并且k自增1,完毕后返回数组A。
少量移动,效率较快。
代码:
public class LeetcodeTest {
public static void main(String[] args) {
Solution So = new Solution();
int[] A = {3,1,2,4};
int[] res = So.sortArrayByParity2(A);
for(int i=0; i<res.length; i++){
System.out.print(res[i] + " ");
}
}
}
class Solution {
//优化前:
/*
* 分析:
* k表示排完后偶数的索引,初始为0,指针i遍历数组A,遇到偶数,
* 将索引为k到i-1之间的数全部后移一位,索引为i的数放在索引为k的位置上,
* 并且k自增1,完毕后返回数组A。
* 因为需要大量移动,效率较慢。
*/
public int[] sortArrayByParity1(int[] A) {
int k = 0;//偶数索引
for(int i=0; i<A.length; i++){
if(A[i]%2 == 0){
int temp = A[i];
for(int j=i-1; j>=k; j--){
A[j+1] = A[j];
}
A[k] = temp;
k++;
}
}
return A;
}
//优化后:
/*
* 分析:
* k表示排完后偶数的索引,初始为0,指针i遍历数组A,遇到偶数,
* 只需要将索引为k的数与索引为i的数交换,
* 并且k自增1,完毕后返回数组A。
* 少量移动,效率较快。
*/
public int[] sortArrayByParity2(int[] A) {
int k = 0;
for(int i=0; i<A.length; i++){
if(A[i]%2 == 0){
int temp = A[i];
A[i] = A[k];
A[k] = temp;
k++;
}
}
return A;
}
}