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);
}

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

 思路及算法

“回文串”是一个正读和反读都一样的字符串,比如“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<s.length();i++){
        char c = s.charAt(i);
        if (Character.isLetterOrDigit(c)){
            builder.append(Character.toLowerCase(c));
        }
    }
    return builder.toString().equals(builder.reverse().toString());
}

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

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<Integer,Integer> 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<Integer,Integer> 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从入门到实战

 

 

 

  • 46
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

哪 吒

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

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

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

打赏作者

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

抵扣说明:

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

余额充值