LeetCode: Implement pow(x, n).

LeetCode有道题要求实现pow(x,n)即x的n次方,原题地址为:https://leetcode.com/problems/powx-n/

  提交Math.pow(x,n)也能通过 但是很明显没啥意义。
  
  个人想了一个动态规划的实现方式,先将n转换为2进制,然后将x的各个2的指数次幂提前求好,当然2的指数不能(不需要)超过n,然后根据n的2进制,将2进制位上为1的幂进行累成,以3的9次方为例说明:
9的2进制为:1001             //长度为4
设置pows数组 int[] pows = new int[4]    //2进制长度为4,所以大小为4
pows取值为pow[0]=x^(2^0)=x;  pow[1]=x^(2^1); pow[i]=x^(2^i);
根据9的二进制1001,第3位和第0位结果为1,因此最后结果为pow[3]*pow[0],即x^(2^3) * x^(2^0) = x^9.

这样做还是比较快的,代码如下:

import java.util.ArrayList;

public class Solution {

    //将一个数转换为2进制,因为测试数据中有-2147483648,超出int型的范围
    //所以使用double,这样在除以2的时候就需要转换为int型
    public ArrayList<Integer> n2binary(double n){
        ArrayList<Integer> binary = new ArrayList<Integer>();
        while(n>0){
            if(n%2==1){
                binary.add(1);
            }else{
                binary.add(0);
            }
            n = (int)(n/2); //n为double,强制转换
        }

        return binary;
    }

    public double myPow(double x, int n) {

        boolean neg = false;
        double nr;  //n_replace,nr为n的替代值,防止n为负值

        if(n<0){    
            neg = true;
            nr = -((double)n);//-2147483648取负值后仍为-2147483648,奇怪,需要先强制转换为double
        }else if(n>0){
            nr = n;
        }else{
            return 1;
        }

        if(x==1){
            return 1;
        }else if(x==-1){
            if(nr%2==0){
                return 1;
            }else{
                return -1;
            }
        }

        double res = 1;
        ArrayList<Integer> n2s = n2binary(nr);

        //构建大小为k的幂数组,pows[i]的值表示x^(2^i)次方
        double[] pows = new double[n2s.size()];

        pows[0] = x;

        for(int i=1;i<n2s.size();i++){
            pows[i] = pows[i-1]*pows[i-1];
        }

        for(int i=n2s.size()-1;i>=0;i--){
            if(n2s.get(i)==1)
                res *= pows[i];
        }

        if(neg){    //指数为负数的处理操作
            return 1/res;
        }

        return res;
    }

    public static void main(String[] args) {
        Solution s = new Solution();
        System.out.println(s.myPow(-1, -2147483648));
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
org.elasticsearch.client.ResponseException: method [PUT], host [http://192.168.93.132:9200], URI [/TestIndex], status line [HTTP/1.1 406 Not Acceptable] {"error":"Content-Type header [application/vnd.elasticsearch+json; compatible-with=8] is not supported","status":406} at org.elasticsearch.client.RestClient.convertResponse(RestClient.java:347) at org.elasticsearch.client.RestClient.performRequest(RestClient.java:313) at org.elasticsearch.client.RestClient.performRequest(RestClient.java:288) at co.elastic.clients.transport.rest_client.RestClientTransport.performRequest(RestClientTransport.java:146) at co.elastic.clients.elasticsearch.indices.ElasticsearchIndicesClient.create(ElasticsearchIndicesClient.java:266) at co.elastic.clients.elasticsearch.indices.ElasticsearchIndicesClient.create(ElasticsearchIndicesClient.java:282) at com.sora.leetcode_notebook.ElasticSearch.ElasticsearchJavaApi.createIndex(ElasticsearchJavaApi.java:52) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:59) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:56) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27) at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306) at org.junit.runners.BlockJUnit4ClassRunner$1.evaluate(BlockJUnit4ClassRunner.java:100) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:366) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:103) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:63) at org.junit.runners.ParentRunner$4.run(ParentRunner.java:331) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329) at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293) at org.junit.runners.ParentRunner$3.evaluate(ParentRunner.java:306) at org.junit.runners.ParentRunner.run(ParentRunner.java:413) at org.junit.runner.JUnitCore.run(JUnitCore.java:137) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69) at com.intellij.rt.junit.IdeaTestRunner$Repeater$1.execute(IdeaTestRunner.java:38) at com.intellij.rt.execution.junit.TestsRepeater.repeat(TestsRepeater.java:11) at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:35) at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:235) at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54)
06-06

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值