Leetcode刷题篇(一)

本文精选LeetCode上的经典算法题目,解析从简单到困难的解题思路,涵盖位运算、数组处理、哈希表应用及游戏策略算法。通过实例演示如何高效解决常见问题,如判断二的幂次方、寻找数组中唯一元素、检测重复项、查找数组中目标和的两数、Nim游戏策略及判断3的幂次方和回文数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

从Leetcode中每天一道题 从简单到困难

1 给定一个整数判断它是不是二的幂次方

这种题 见过就会 没见过就可能是想不出来:实现是如果是二的整数次幂n和n-1按位与结果为零
重点是对位运算符的理解

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

2 给定一个为空数组 除了某一个元素出现一次 其余的元素出现两次 求出那个出现了一次的元素

这道题也是考察了位运算的掌握:
1任何数于0异或为任何数 0 ^ n => n

2相同的数异或为0: n ^ n => 0

class Solution {
    public int singleNumber(int[] nums) {
        int num =0;
        for(int i=0;i<nums.length;i++){
            num ^= nums[i];    
        }
        return num;
    }
}

3 给定一个整数数组 判断是否有重复元素:

利用Set的无序不可重复的特性 出现重复的元素 会覆盖 造成Set的size与数组的length不相同
思路大概是四种:
1)n^2的复杂度,暴力两层循环去逐个判断

2)排序,然后扫一遍检查相邻两元素是否有相等的情况(使用的是Arrays类中的sort方法 )

3)从前向后扫,把出现过的元素记下来,每个新元素检查下之前是否出现过

4)转为set,判断set长度与list是否相等

class Solution {
    public boolean containsDuplicate(int[] nums) {
        Set set = new HashSet();
        for(int i=0;i<nums.length;i++){
            set.add(nums[i]);
        }
        return (set.size()<nums.length);
    }
}

4 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

这道题上来的最简单的思路就是使用暴力破解 但是很显然时间复杂度太高 不是最好的选择

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int[] a = new int [2];
        for (int i = 0; i < nums.length; i++) {
            for (int j = i + 1; j < nums.length; j++) {
                if (nums[j] == target - nums[i]) {
                    a[0] =i;
                    a[1] = j;
                    return a;
                }
            }
        }
    throw new IllegalArgumentException("No two sum solution");
    }
}

使用HashMap能减少依次循环 时间复杂度是O(n)

class Solution { 
	public int[] twoSum(int[] nums, int target) {
		int i=0;
		int j=0;
		HashMap<Integer,Integer> hash=new HashMap<>();
		for(i=0;i<nums.length;i++) {	
			if(hash.containsKey(target-nums[i]) ) {
				j=hash.get(target-nums[i]);
				break;
			}	
			else hash.put(nums[i], i);
		}
		if(i<=j){
			int result[]={i,j};return result;
		}
		else {
			int result[]={j,i};return result;
		}
	}
}

5 你和你的朋友,两个人一起玩 Nim游戏:桌子上有一堆石头,每次你们轮流拿掉 1 - 3 块石头。 拿掉最后一块石头的人就是获胜者。你作为先手。你们是聪明人,每一步都是最优解。 编写一个函数,来判断你是否可以在给定石头数量的情况下赢得游戏

这种题是脑筋急转弯的题,但是这道题比较简单 只要给对手留下4的倍数的石头就必赢

class Solution {
    public boolean canWinNim(int n) {
        return n%4 !=0;
    }
}

6 给定一个整数,写一个函数来判断它是否是 3 的幂次方。

class Solution {
    public boolean isPowerOfThree(int n) {
      if(n<=0){return false;}
        while(n>=3){
            n /=3;
        }
        return n ==1;
    }   
    
}

7判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数

这道题你一看简单 就是将字符串反向输出就行,然后和原字符串进行比较就行 于是你写出了下面的代码

class Solution {
    public boolean isPalindrome(int x) {
        if(x <0) return false;
        String str1 = String.valueOf(x);
        String str2 = "";
        for(int i = str1.length() -1;i >= 0;i --){
            str2 += str1.charAt(i);
        }
        return str2.equals(str1);
    }    
       
}

完美一次就过看着屏幕前的提交成功 没想到你的上司已经在锤爆你狗头的路上了 在for循环中使用String 的拼接 会创建大量的对象 造成程序的崩溃

内容概要:该研究通过在黑龙江省某示范村进行24小时实地测试,比较了燃煤炉具与自动/手动进料生物质炉具的污染物排放特征。结果显示,生物质炉具相比燃煤炉具显著降低了PM2.5、CO和SO2的排放(自动进料分别降低41.2%、54.3%、40.0%;手动进料降低35.3%、22.1%、20.0%),但NOx排放未降低甚至有所增加。研究还发现,经济性和便利性是影响生物质炉具推广的重要因素。该研究不仅提供了实际排放数据支持,还通过Python代码详细复现了排放特征比较、减排效果计算和结果可视化,进步探讨了燃料性质、动态排放特征、碳平衡计算以及政策建议。 适合人群:从事环境科学研究的学者、政府环保部门工作人员、能源政策制定者、关注农村能源转型的社会人士。 使用场景及目标:①评估生物质炉具在农村地区的推广潜力;②为政策制定者提供科学依据,优化补贴政策;③帮助研究人员深入了解生物质炉具的排放特征和技术改进方向;④为企业研发更高效的生物质炉具提供参考。 其他说明:该研究通过大量数据分析和模拟,揭示了生物质炉具在实际应用中的优点和挑战,特别是NOx排放增加的问。研究还提出了多项具体的技术改进方向和政策建议,如优化进料方式、提高热效率、建设本地颗粒厂等,为生物质炉具的广泛推广提供了可行路径。此外,研究还开发了个智能政策建议生成系统,可以根据不同地区的特征定制化生成政策建议,为农村能源转型提供了有力支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

上山打卤面

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值