LeetCode算法,每日一题,冲击阿里巴巴,day2

目录

1、LeetCode 125.验证回文串

题目

小编菜解

 思路及算法

小菜改进版

大佬指点江山

2、LeetCode 136.只出现一次的数字

题目

小编菜解

大佬指点江山

3、LeetCode 169.多数元素

题目

小编菜解

小编菜解改进版

大佬指点江山

4、关注公众号哪吒编程,回复1024,获取Java学习资料,还有不定期的送书活动


1、LeetCode 125.验证回文串

题目

给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。

说明:本题中,我们将空字符串定义为有效的回文串。

小编菜解

public static boolean isPalindrome(String s) {
    // 通过正则表达式只获取数字和字母部分
    s=s.replaceAll("[^a-zA-Z0-9]","").toLowerCase();
    // 回文串是指中间分隔,前面的和后面的revert一样
    int length = s.length();
    String left = "";
    String right = "";
    if (length%2 != 0){
        left = s.substring(0,length/2);
        right = s.substring(length/2+1,length);
        right = new StringBuilder(right).reverse().toString();
    }else{
        int mid = length/2;
        left = s.substring(0,mid);
        right = s.substring(mid,length);
        right = new StringBuilder(right).reverse().toString();
    }
    return left.equals(right);
}

虽然执行通过了,但效率堪忧啊。

LeetCode算法,每日一题,冲击阿里巴巴,day2_第1张图片

 思路及算法

“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。

所以为什么要中间分隔呢,直接反转,对比反转后的和初始的,不就完事了?菜啊。

小菜改进版

public static boolean isPalindrome3(String s) {
    // 通过正则表达式只获取数字和字母部分
    s=s.replaceAll("[^a-zA-Z0-9]","").toLowerCase();
    return s.equals(new StringBuilder(s).reverse().toString());
}

效率依旧很低,因为正则的缘故吧。

大佬指点江山

public static boolean isPalindrome(String s) {
    StringBuilder builder = new StringBuilder();
    for (int i = 0;i

LeetCode算法,每日一题,冲击阿里巴巴,day2_第2张图片

 差距还是很明显的,能不用正则就不要用正则表达式。  

2、LeetCode 136.只出现一次的数字

题目

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

小编菜解

/**
 * 暴力算法,当前元素与其它元素进行比较,如果有相等的,则表示出现不止一遍,不等,则表示唯一
 */
public static int singleNumber(int[] nums) {
    for (int i = 0; i < nums.length; i++) {
        boolean flag = true;
        for (int j = 0; j < nums.length; j++) {
            if (i != j){
                if (nums[i] == nums[j]){
                    flag = false;
                    break;
                }
            }
        }
        if (flag){
            return nums[i];
        }
    }
    return 0;
}

大佬指点江山

参与运算的两个值,如果两个相应bit位相同,则结果为0,否则为1。

public static int singleNumber(int[] nums) {
    int single = 0;
    for (int num : nums) {
        single ^= num;
    }
    return single;
}

3、LeetCode 169.多数元素

题目

给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

小编菜解

public static int majorityElement(int[] nums) {
    if (nums.length == 1){
        return nums[0];
    }

    for (int i = 0; i < nums.length; i++) {
        int sum = 1;
        for (int j = 0; j < nums.length; j++) {
            if (i != j){
                if (nums[i] == nums[j]){
                    sum++;
                }
            }
        }

        if (sum > nums.length/2){
            return nums[i];
        }
    }
    return 0;
}

小编菜解改进版

public static int majorityElement(int[] nums) {
    Map map = new HashMap<>();
    for (int i = 0; i < nums.length; i++) {
        if (!map.containsKey(nums[i])){
            map.put(nums[i],1);
        }else{
            map.put(nums[i],map.get(nums[i]) + 1);
        }
    }
    for (Map.Entry entry : map.entrySet()){
        if(entry.getValue() > nums.length/2){
            return entry.getKey();
        }
    }
    return 0;
}

执行用时少了不止一点点啊,进步显著,加油。

大佬指点江山

public static int majorityElement(int[] nums) {
    Arrays.sort(nums);
    int mid = nums.length/2;
    return nums[mid];
}

纳尼?还可以这样玩?思考思考,还真是这样,因为要取得众数,众数一定大于半数,如果排序完之后,这个数组的最中间肯定属于众数,牛逼plus。

4、关注公众号哪吒编程,回复1024,获取Java学习资料,还有不定期的送书活动

  1. C语言从入门到项目实战
  2. HTML5+CSS3+JavaScript从入门到精通
  3. 深入理解SpringMVC源代码
  4. Sql Server从入门到实战

LeetCode算法,每日一题,冲击阿里巴巴,day2_第3张图片

 

 LeetCode算法,每日一题,冲击阿里巴巴,day2_第4张图片

 

你可能感兴趣的:(LeetCode,java)