【LeetCode】50. Pow(x, n)、905. 按奇偶排序数组(给定一个非负整数数组 A,返回一个由 A 的所有偶数元素组成的数组,后面跟 A 的所有奇数元素)

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;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值