从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 的拼接 会创建大量的对象 造成程序的崩溃