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天算法入门 - 每日三题 - Day15判断子序列最长回文数Fizz Buzz的主要内容,如果未能解决你的问题,请参考以下文章
100天算法入门 - 每日三题 - Day12Nim游戏3的幂4的幂
100天算法入门 - 每日三题 - Day5最后一个单词的长度相同的树买卖股票的最佳时机
100天算法入门 - 每日三题 - Day16第三大的数字符串中的单词数排列硬币
100天算法入门 - 每日三题 - Day10二叉树的所有路径各位相加丑数