100天算法入门 - 每日三题 - Day15判断子序列最长回文数Fizz Buzz

Posted 哪 吒

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了100天算法入门 - 每日三题 - Day15判断子序列最长回文数Fizz Buzz相关的知识,希望对你有一定的参考价值。

 大连棒棰岛


算法是进阶架构师的基础,基础不牢,地动山摇,2021-8-14起开始刷题,目标100天,300道LeetCode算法题,分享是学习的最好方式,加油,嗨起来。

1、LeetCode 392.判断子序列

题目

给定字符串 s 和 t ,判断 s 是否为 t 的子序列。

字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。

小编解题思路

 1、因为判断"ace"是否"abcde"的一个子序列,所以循环s,判断s中的每个字符是否都在t中存在即可
2、存在一个t的循环开始下角标+1,递增
3、如果s中的最后一个字符依然在t中存在,则表示是一个子序列 

小编菜解

/**
 * 小编基本思路
 * 1、因为判断"ace"是否"abcde"的一个子序列,所以循环s,判断s中的每个字符是否都在t中存在即可
 * 2、存在一个t的循环开始下角标+1,递增
 * 3、如果s中的最后一个字符依然在t中存在,则表示是一个子序列
 */
public static boolean isSubsequence(String s, String t) {
    if (s.equals("")){
        return true;
    }
    //右移的下角标
    int left = 0;
    char last = 0;
    for (int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);
        //找到最后一个字符
        if (i == s.length() - 1){
            last = s.charAt(i);
        }
        for (int j = left; j < t.length(); j++) {
            char c1 = t.charAt(j);
            if (last != 0 && last == c1){
                return true;
            }
            if (c == c1){
                left++;
                break;
            }
            left++;
        }
    }
    return false;
}

提交通过了,总感觉哪里不对劲,但也想不清楚,且看看官方答案再说吧!

大佬指点江山

public boolean isSubsequence(String s, String t) {
    int n = s.length(), m = t.length();
    int i = 0, j = 0;
    while (i < n && j < m) {
        if (s.charAt(i) == t.charAt(j)) {
            i++;
        }
        j++;
    }
    return i == n;
}

这个思想啊,真的是有待进步。

2、LeetCode 409.最长回文数

题目

给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。

在构造过程中,请注意区分大小写。比如 "Aa" 不能当做一个回文字符串。

小编思路

1、回文字符串,表示reverse之后,与原字符串一致
2、表明只能有一个奇数的字母,其余字母都是偶数
3、如果有奇数,则获取个数最多的那个奇数,因为回文数,最多只能有一个奇数
4、如果没有奇数字母,长度为偶数之和

小编菜解

public static int longestPalindrome(String s) {
    if (s == null || s.length()==0){
        return 0;
    }
    //将字符串中字符放入map,值为字符的个数
    Map<Character,Integer> map = new HashMap<>();
    for (int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);
        map.put(c,map.getOrDefault(c,0) + 1);
    }

    //偶数字母总长度
    int size = 0;
    //奇数字母最大长度
    int oddSize = 0;
    //只能有一个奇数的字母,其余字母都是偶数
    List<Character> removeCharacterlist = new ArrayList<>();
    for(Map.Entry<Character,Integer> entry:map.entrySet()){
        //获取奇数字母最大长度
        if (entry.getValue()%2 == 1){
            if (entry.getValue() > oddSize){
                oddSize = entry.getValue();
            }
        }else{//如果是偶数,则获取长度,直接相加
            size += entry.getValue();
        }
    }
    return size + oddSize;
}

错误的原因是对回文数的理解有误,如果为奇数,取它的偶数个,也是可以的。

小编菜解进阶版

public int longestPalindrome(String s) {
    if (s == null || s.length()==0){
        return 0;
    }
    //将字符串中字符放入map,值为字符的个数
    Map<Character,Integer> map = new HashMap<>();
    for (int i = 0; i < s.length(); i++) {
        char c = s.charAt(i);
        map.put(c,map.getOrDefault(c,0) + 1);
    }

    boolean isHaveOdd = false;
    //偶数字母总长度
    int size = 0;
    //奇数字母最大长度
    int oddSize = 0;
    //只能有一个奇数的字母,其余字母都是偶数
    List<Character> removeCharacterlist = new ArrayList<>();
    for(Map.Entry<Character,Integer> entry:map.entrySet()){
        //获取奇数字母最大长度
        if (entry.getValue()%2 == 1){
            size += entry.getValue()-1;
            isHaveOdd = true;
        }else{//如果是偶数
            size += entry.getValue();
        }
    }
    return isHaveOdd?size + oddSize + 1:size + oddSize;
}

大佬指点江山

public static int longestPalindrome(String s) {
    int[] count = new int[128];
    int length = s.length();
    for (int i = 0; i < length; ++i) {
        char c = s.charAt(i);
        count[c]++;
    }

    int ans = 0;
    for (int v: count) {
        //大佬这块的思想很好
        ans += v / 2 * 2;
        if (v % 2 == 1 && ans % 2 == 0) {
            ans++;
        }
    }
    return ans;
}

3、LeetCode 412.Fizz Buzz

题目

写一个程序,输出从 1 到 n 数字的字符串表示。

1. 如果 n 是3的倍数,输出“Fizz”;

2. 如果 n 是5的倍数,输出“Buzz”;

3.如果 n 同时是3和5的倍数,输出 “FizzBuzz”。

小编菜解

public List<String> fizzBuzz(int n) {
    final String const_FIZZ = "Fizz";
    final String const_BUZZ = "Buzz";
    List<String> list = new ArrayList<>();
    for (int i = 1; i <= n; i++) {
        if (i%3==0 && i%5==0){
            list.add(const_FIZZ+const_BUZZ);
        }else if (i%3 == 0){
            list.add(const_FIZZ);
        }else if (i%5 == 0){
            list.add(const_BUZZ);
        }else{
            list.add(String.valueOf(i));
        }
    }
    return list;
}

这道题有点简单了点吧?

推荐阅读

【100天算法入门 - 每日三题 - Day14】两个数组的交集、有效的完全平方数、字符串中的第一个唯一字符

【100天算法入门 - 每日三题 - Day13】反转字符串、反转字符串中的元音字母、两个数组的交集

【100天算法入门 - 每日三题 - Day12】Nim游戏、3的幂、4的幂

【100天算法入门 - 每日三题 - Day11】丢失的数字、移动零、单词规律

【100天算法入门 - 每日三题 - Day10】二叉树的所有路径、各位相加、丑数 

【100天算法入门 - 每日三题 - Day9】汇总区间、2的幂、有效的字母异位词

【100天算法入门 - 每日三题 - Day8】同构字符串、存在重复元素、翻转二叉树

【100天算法入门 - 每日三题 - Day7】验证回文串、只出现一次的数字、多数元素

【100天算法入门 - 每日三题 - Day6】对称二叉树、二叉树的最大深度、将有序数组转换为二叉搜索树

【100天算法入门 - 每日三题 - Day5】最后一个单词的长度、相同的树、买卖股票的最佳时机

以上是关于100天算法入门 - 每日三题 - Day15判断子序列最长回文数Fizz Buzz的主要内容,如果未能解决你的问题,请参考以下文章

100天算法入门 - 每日三题 - Day12Nim游戏3的幂4的幂

100天算法入门 - 每日三题 - Day5最后一个单词的长度相同的树买卖股票的最佳时机

100天算法入门 - 每日三题 - Day16第三大的数字符串中的单词数排列硬币

100天算法入门 - 每日三题 - Day10二叉树的所有路径各位相加丑数

100天算法入门 - 每日三题 - Day13反转字符串反转字符串中的元音字母两个数组的交集

100天算法入门 - 每日三题 - Day17找到所有数组中消失的数最小操作次数使数组元素相等分发饼干