leetcode easy刷题心得

持续更新

67.二进制求和

给定两个二进制,返回他们的和。输入为非空字符串并且只包含1和0.

class Solution {
    public String addBinary(String a, String b) {
        StringBuilder result = new StringBuilder();   //StringBuider是可以随时修改的,但String是不可修改的,所以StringBuider的速度比String快得多,详情见下。
        
        int al = a.length()-1;
        int bl = b.length()-1;
        int carry = 0;
        
        while( al >=0  || bl >=0 )
        {
            int sum = carry;
            if(al >= 0)
            {
                sum += (a.charAt(al) - '0');
                al--;
            }
            if(bl >= 0)
            {
                sum += (b.charAt(bl) - '0');
                bl--;
            }
            result.append(sum%2);   //相加结果
            carry = sum /2;         //进位,如果是1那么carry=0,如果是2则要进位给下面一位+1
        }
        
        if(carry !=0 )              //都相加完了,还要进位的情况
            result.append(1);
        
        return result.reverse().toString();  //先反转,再输出
    }
}

 参考链接:String,StringBuider和StringBuffer的区别


69.x的平方根

实现int sqrt(int x)函数,返回整数x的平方根,只保留整数部分,小数部分将被舍去(如8开方后为2.82842...,只留下2)

思路:使用二分搜索法(在下面)来找平方根

 1 class Solution {
 2     public int mySqrt(int x) {
 3         if (x <= 1) return x;
 4         int left = 0, right = x;
 5         while (left < right) {
 6             int mid = left + (right - left) / 2;
 7             if (x / mid >= mid) left = mid + 1;
 8             else right = mid;
 9         }
10         return right - 1;
11     }
12 }
 二分搜索法

一种常见的搜索方法,将线性时间提升到了对数时间,大大的缩短了搜索时间

参考链接

 


70.爬楼梯

一次可以爬一节或者两节楼梯,求问第N节楼梯有几种不同的爬法(给出2节楼梯有两种爬法,三种楼梯有三种爬法)

思路:假如一共有n节楼梯,如何爬到第n节呢?因为每次只能爬一节或者两节,第n层不然就是从n-1层一步上来的,不然就是n-2层两步上来的,所以:sum[n]=sum[n-1]+sum[n-2]

 1 class Solution {
 2     public int climbStairs(int n) {
 3         if(n==1)return 1;       //如果只有一节楼梯,就只有一种爬法
 4         int sum[]=new int[n+1];   //sum[n]是第n节楼梯有几种爬法
 5         sum[0]=0;sum[1]=1;sum[2]=2;
 6      for(int i=3;i<=n;i++){
 7          sum[i]=sum[i-2]+sum[i-1];  //
 8      }
 9         return sum[n];
10     }
11 }

 


83.删除排序链表中的重复元素

链表

 


 

88.合并两个数组

将A、B两个数组的元素按大小合成一个数组

public class Solution {
    public void merge(int A[], int m, int B[], int n) {        //直接在A中插入,把A拓展成一个m+n大小的数组
        while(m > 0 && n >0){
            if(A[m-1] > B[n-1]){      //A的最后一个和B的最后一个进行比较
                A[m+n-1] = A[m-1];
                m--;
            }else{
                A[m+n-1] = B[n-1];
                n--;
            }
        }
        while(n > 0){  //如果A的元素有剩余,不用管,放在原地即可
            A[m+n-1] = B[n-1];            //如果B的元素有剩余,直接把B多出来的元素全部放入A中
            n--;
        }
    }
}

 

125.验证回文串(全)

136.只出现一次的数字

167.两数之和II

168.Excel列表名。思路:模仿十进制

169.求众数 

 204.计数质数

217.存在重复元素

public class Solution {
    public boolean containsDuplicate(int[] nums) {
        Arrays.sort(nums);   //Array.sort(数组);  对数组进行排序
        for(int i = 0; i < nums.length-1; i++) {
            if(nums[i] == nums[i+1]) {   //相邻两个数字等
                return true; 
            }
        }
        return false;
    }
}

 

219.存在重复元素2(hash map)


 

231.2的幂

查看一个数书否是2的幂,其中1也是。哇,这道题有好多思路哦

方法1:循环。。如果一个数是2的幂,那可以一直除以2,知道得数为1为止。

public boolean isPowerOfTwo(int n){
    if(i == 1) return true;
   if((i>1)&&(i%2 == 0)){
    return isPowerOfTwo(n/2);
  }
   return false; }

 

方法2:对数法,见326【3的幂】那道题,只要看到幂!就能用对数!学到了没有!(要用10为底,不要用e为底,容易溢出!)

class Solution {
    public boolean isPowerOfThree(int n) {
     double tem = Math.log10(n) / Math.log10(2); //log(N)是以e为底的,logx(N)是以x为底的,这里要用以10为底的哦,以e为底,数字太大的话会溢出
        return (tem - (int)(tem)) == 0?true:false;
    }
}

 

方法3:二进制法。如果一个数是2的幂,那么他的二进制只有第一位是1,剩下的位数都是0。

public boolean isPowerOfTwo(int n) {
        return (n>0)&&(countBit(n)==1);   //数字大于0且二进制只有一个1
    }
public int countBit(int num){ //计算二进制有几个1 int count=0; while(num!=0){ count+=(num & 1); //位与运算符(&),见下
            num>>=1;
        }    
        return count;
    }

 

位与运算符(&)

运算规则:两个数都转为二进制,然后从高位开始比较,如果两个数都为1则为1,否则为0。
比如:129&128.
129转换成二进制就是10000001,128转换成二进制就是10000000。从高位开始比较得到,得到10000000,即128.

 参考:https://www.cnblogs.com/yesiamhere/p/6675067.html

 

但是!二进制还有一种聪明方法:只能有最高位为0

    public boolean isPowerOfTwo(int n) {
        if(n<=0)
            return false;
        return (n&(n-1))==0;  //return(n>0)&&(n&(n-1)==0);
    }

 


 【326】3的幂

Given an integer, write a function to determine if it is a power of three.

27 true  0 true  9 true  45 false 你是否可以不用任何loop或者递归完成

 

思路1:采用对数的方法,一个数是3的幂方,那么以3为底n的对数一定是个整数。

class Solution {
    public boolean isPowerOfThree(int n) {
     double tem = Math.log10(n) / Math.log10(3); //log(N)是以e为底的,logx(N)是以x为底的,这里要用以10为底的哦,以e为底,数字太大的话会溢出
        return (tem - (int)(tem)) == 0?true:false;
    }
}

 【注意】Math.log只有三种关于log的使用方法:

static double log(double a)
返回(底数是 e)double 值的自然对数。

static double log10(double a)
返回 double 值的底数为 10 的对数。

static double log1p(double x)
返回参数与 1 的和的自然对数。

转载于:https://www.cnblogs.com/white-beauty/p/10043437.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值