leetcode刷题(n的幂、数组的交集)

题目一描述:
给定一个整数n,判断其是否是3的幂次方
题目传送门
给定一个整数n判断其是否是4的幂次方
题目传送门
题目一分析:
同一种类型的题目判断一个整数是不是一个数的n次幂,自从学了计算机,是我慢慢的变得像计算机一样思考问题,总想着循环递归解决这个问题,而没想着大多数的问题使用数学就可以计算。
x^k = n就可以的出k = logx(n),java的lang包中的Math类中有log10(int num)因此采用换底公式logx(n) = log10(n)/log10(x)
代码如下:

class Solution {
    public boolean isPowerOfThree(int n) {
        return changeBasic(n);
    }
    //方式一
    //递归求解
    public boolean getFlag(int n){
        if(n==1)return true;
        if(n%3!=0||n==0)return false;
        else return isPowerOfThree(n/3);
    }
    //方式二:数学计算
    public boolean changeBasic(int n){
       double temp =  Math.log10(n)/Math.log10(3);
       return (temp-(int)temp)==0;
    }
}

四的幂:

class Solution {
    public boolean isPowerOfFour(int num) {
        
        return getPower(num);
    }
    public boolean getPower(int num){
        if(num == 1)return true;
        if(num%4!=0||num==0)return false;
        return getPower(num/4);
    }
    public boolean getFour(int num){
        double temp = Math.log10(num)/Math.log10(4);
        return temp - (int)temp ==0;
    }
}

题目二描述:
给定两个数组,求两个数组的交集。

输入:nums1 = {1,2,2,1} nums2 = {2,2}
输出:result = {2}

题目传送门
题目二分析:
对于两个数组的交集,不熟悉集合API时,可以自己将第一个数组放在集合中,第二个数组进行遍历匹配,将相同的元素放入一个新的集合中,放入集合的原因是交集的个数是未知的。
如果对集合的API熟悉,那么在Set集合中有一个方法为retainAll,因此可以将两个数组转为set集合进行处理。
set集合api方法
代码如下:

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        return getsection(nums1,nums2);
    }
    //方式一:
	//最基本的方式
    public int[] getinter(int[] nums1,int[] nums2 ){
    	//存放数组1的元素
        Map<Integer,Integer> map = new HashMap<>();
        //放交集的集合
        List<Integer> list = new ArrayList();
        //将数组1元素放入集合
        for(int i=0;i<nums1.length;i++){
            if(!map.containsKey(nums1[i])) map.put(nums1[i],0);
        }
        //将数组2进行对比
        for(int i=0;i<nums2.length;i++ ){
            if(map.containsKey(nums2[i]))
            map.put(nums2[i],map.get(nums2[i])+1);
        }
		//遍历map集合,大于0的认为是交集
        Iterator ii = map.keySet().iterator();
        while(ii.hasNext()){
            Integer temp = (Integer)ii.next();
            if(map.get(temp)>0)list.add(temp);
        }
       //返回数组,将交集集合中的元素放入数组
        int[] arr = new int[list.size()];
		for(int i=0;i<arr.length;i++) {
			arr[i] = list.get(i);
		}
		return arr;
    }
    //方式二
    //对API熟悉的方式
    public int[] getsection(int[] nums1,int[] nums2){
    //将数组转为两个set集合处理
        Set<Integer> set1 = new HashSet();
        Set<Integer> set2 = new HashSet();
        for(int i=0;i<nums1.length;i++)set1.add(nums1[i]);
        for(int i=0;i<nums2.length;i++)set2.add(nums2[i]);
        //使用方法retainAll方法求交集
        set1.retainAll(set2);
        int[] res = new int[set1.size()];
        //将交集元素放入数组
        int k = 0;
        for(int s:set1) res[k++] = s;
        return res;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值