leetcode刷题记录_1

最长公共前缀

  • 编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 “”。
  • 思路:先利用Arrays.sort(strs)为数组排序,再将数组第一个元素和最后一个元素的字符从前往后对比即可!
    @Test
    public void comHeadTest() {
        String[] strs = new String[]{"qwe", "qwerrr", "q"};
        boolean flag = checkStr(strs);
        if (!flag) {
            System.out.println("");
            return;
        }
        Arrays.sort(strs);
        StringBuffer sb = new StringBuffer();
        int num = Math.min(strs[0].length(), strs[strs.length - 1].length());
        for (int i = 0; i < num; i++) {
            if (strs[0].charAt(i) != strs[strs.length - 1].charAt(i)) {
                break;
            } else {
                sb.append(strs[0].charAt(i));
            }
        }
        System.out.println(sb.toString());
    }

    private boolean checkStr(String[] strs) {
        boolean flag = true;
        for (int i = 0; i < strs.length; i++) {
            if (strs[i] == null || strs[i].length() == 0) {
                flag = false;
                break;
            }
        }
        return flag;
    }

最长回文串

  • 给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。在构造过程中,请注意区分大小写。比如"Aa"不能当做一个回文字符串。注
    意:假设字符串的长度不会超过 1010。
输入:
"abccccdd"

输出:
7

解释:
我们可以构造的最长的回文串是"dccaccd", 它的长度是 7。
  • 思路:统计字符出现次数为双数的组合+一个只出现一次的字符,遍历str,每次将char存入set集合中时先判断是否存在,如果存在,删除存在的char并count++,最后判断set是否为空,非空+1
class Solution {
  public  int longestPalindrome(String s) {
    if (s.length() == 0)
      return 0;
    // 用于存放字符
    HashSet<Character> hashset = new HashSet<Character>();
    char[] chars = s.toCharArray();
    int count = 0;
    for (int i = 0; i < chars.length; i++) {
      if (!hashset.contains(chars[i])) {// 如果hashset没有该字符就保存进去
        hashset.add(chars[i]);
      } else {// 如果有,就让count++(说明找到了一个成对的字符),然后把该字符移除
        hashset.remove(chars[i]);
        count++;
      }
    }
    return hashset.isEmpty() ? count * 2 : count * 2 + 1;
  }
}

验证回文串

  • 给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。 说明:本题中,我们将空字符串定义为有效的回文串。
输入: "A man, a plan, a canal: Panama"
输出: true

输入: "race a car"
输出: false
  • 思路:前后双向遍历,跳过非字母和数字的char,判断前后的char是否一致。
    @Test
    public void reversion() {
        String str = "A man, a plan, a canal: Panama";
        boolean flag = true;
        if (str.length() == 0 || str == null) {
            System.out.println(flag);
            return;
        }
        int left = 0;
        int right = str.length() - 1;
        while (left < right) {
            if (!Character.isLetterOrDigit(str.charAt(left))) {
                left++;
            } else if (!Character.isLetterOrDigit(str.charAt(right))) {
                right--;
            } else {
                if (String.valueOf(str.charAt(left)).equalsIgnoreCase(String.valueOf(str.charAt(right)))) {
                    left++;
                    right--;
                } else {
                    flag = false;
                    break;
                }
            }
        }
        System.out.println(flag);
    }
}

把字符串转换成整数

  • 将一个字符串转换成一个整数(实现Integer.valueOf(string)的功能,但是string不符合数字要求时返回0),要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。

  • 思路:用Character.isDigit()方法判断是否为数字,用char-‘0’将char转成int参与运算;别忘记进行符号验证。

    @Test
    public void parseStrToIntTest() {
        String str = "+1542342";
        int i = parseStrToInt(str);
        System.out.println(i);
    }

    private int parseStrToInt(String str) {
        if (str == null) {
            throw new RuntimeException("不能为null");
        }
        int flag = 0;
        if (str.charAt(0) == '-') {
            flag = 1;
        }
        if (str.charAt(0) == '+') {
            flag = 2;
        }
        int start = flag > 0 ? 1 : 0;

        int length = str.length();
        int k = 1;
        int result = 0;
        for (int i = length - 1; i >= start; i--) {
            if (!Character.isDigit(str.charAt(i))) {
                return 0;
            } else {
                result = (str.charAt(i) - '0') * k + result;
                k = k * 10;
            }
        }
        return flag == 1 ? -result : result;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值