1.扑克牌顺子题目大意一副扑克牌抽 5 张牌判断是不是顺子。 规则大小王可以看成任意数字用0表示A 为 1J11Q12K13顺子要求排序后数字连续除去大小王不能有重复牌思路数组排序统计 0大小王的数量遍历非 0 数字如果出现相等 → 直接不是顺子计算相邻两张牌之间空缺需要多少张牌空缺总数 ≤ 大小王数量 → 构成顺子C AC 代码cpp运行#include iostream #include vector #include algorithm using namespace std; bool IsContinuous(vectorint numbers) { if(numbers.size() ! 5) return false; sort(numbers.begin(), numbers.end()); int zero_cnt 0; // 统计大小王 for(int x : numbers) { if(x 0) zero_cnt; } // 遍历非0元素 for(int i zero_cnt; i 4; i) { int cur numbers[i]; int next numbers[i1]; if(cur next) return false; // 对子不可能顺子 zero_cnt - (next - cur - 1); // 需要填补的空位 if(zero_cnt 0) return false; } return true; } int main() { vectorint a(5); for(int i 0; i 5; i) cin a[i]; if(IsContinuous(a)) cout true endl; else cout false endl; return 0; }举例模拟例 10 0 1 3 5排序0 0 1 3 5 zero_cnt2 1 和 3 缺 1 张zero1 3 和 5 缺 1 张zero0 → 满足true例 20 2 2 4 5出现 2、2 重复 → false例 30 1 2 3 5空缺 1有 1 张王补上 → true精简逻辑总结不能有重复非 0 牌牌之间缺口总数 ≤ 王的数量2.最长回文子串题目描述给定一个字符串找出其中最长的回文子串。 回文正读和反读一样。 子串连续一段字符。示例 输入abba→ 输出abba输入babad→ 输出bab或aba输入cbbd→ 输出bb思路中心扩展法笔试首选代码短、好写回文有两种形式奇数长度中心是一个字符aba中心 i偶数长度中心是两个字符abba中心 i,i1遍历每个位置作为中心向左右扩展记录最长回文。C AC 代码cpp运行#include iostream #include string #include algorithm using namespace std; // 中心扩展返回以l,r为中心的最长回文串 string expand(string s, int l, int r) { while(l 0 r s.size() s[l] s[r]) { l--; r; } // 退出时边界是 l1 ~ r-1 return s.substr(l1, r - l - 1); } string longestPalindrome(string s) { if(s.size() 1) return s; string res; for(int i 0; i s.size(); i) { string s1 expand(s, i, i); // 奇数 string s2 expand(s, i, i1); // 偶数 if(s1.size() res.size()) res s1; if(s2.size() res.size()) res s2; } return res; } int main() { string str; cin str; cout longestPalindrome(str) endl; return 0; }暴力写法容易超时仅理解用枚举所有左右区间判断是否回文记录最长。 字符串较长时 TLE不推荐考场使用。cpp运行#include iostream #include string using namespace std; bool isPal(string s) { int l 0, r s.size()-1; while(l r) { if(s[l] ! s[r]) return false; l; r--; } return true; } int main() { string s; cin s; string ans; int n s.size(); for(int i 0; i n; i) { for(int j i; j n; j) { string sub s.substr(i, j-i1); if(isPal(sub) sub.size() ans.size()) ans sub; } } cout ans endl; return 0; }谢谢
C/C++每日一练9
1.扑克牌顺子题目大意一副扑克牌抽 5 张牌判断是不是顺子。 规则大小王可以看成任意数字用0表示A 为 1J11Q12K13顺子要求排序后数字连续除去大小王不能有重复牌思路数组排序统计 0大小王的数量遍历非 0 数字如果出现相等 → 直接不是顺子计算相邻两张牌之间空缺需要多少张牌空缺总数 ≤ 大小王数量 → 构成顺子C AC 代码cpp运行#include iostream #include vector #include algorithm using namespace std; bool IsContinuous(vectorint numbers) { if(numbers.size() ! 5) return false; sort(numbers.begin(), numbers.end()); int zero_cnt 0; // 统计大小王 for(int x : numbers) { if(x 0) zero_cnt; } // 遍历非0元素 for(int i zero_cnt; i 4; i) { int cur numbers[i]; int next numbers[i1]; if(cur next) return false; // 对子不可能顺子 zero_cnt - (next - cur - 1); // 需要填补的空位 if(zero_cnt 0) return false; } return true; } int main() { vectorint a(5); for(int i 0; i 5; i) cin a[i]; if(IsContinuous(a)) cout true endl; else cout false endl; return 0; }举例模拟例 10 0 1 3 5排序0 0 1 3 5 zero_cnt2 1 和 3 缺 1 张zero1 3 和 5 缺 1 张zero0 → 满足true例 20 2 2 4 5出现 2、2 重复 → false例 30 1 2 3 5空缺 1有 1 张王补上 → true精简逻辑总结不能有重复非 0 牌牌之间缺口总数 ≤ 王的数量2.最长回文子串题目描述给定一个字符串找出其中最长的回文子串。 回文正读和反读一样。 子串连续一段字符。示例 输入abba→ 输出abba输入babad→ 输出bab或aba输入cbbd→ 输出bb思路中心扩展法笔试首选代码短、好写回文有两种形式奇数长度中心是一个字符aba中心 i偶数长度中心是两个字符abba中心 i,i1遍历每个位置作为中心向左右扩展记录最长回文。C AC 代码cpp运行#include iostream #include string #include algorithm using namespace std; // 中心扩展返回以l,r为中心的最长回文串 string expand(string s, int l, int r) { while(l 0 r s.size() s[l] s[r]) { l--; r; } // 退出时边界是 l1 ~ r-1 return s.substr(l1, r - l - 1); } string longestPalindrome(string s) { if(s.size() 1) return s; string res; for(int i 0; i s.size(); i) { string s1 expand(s, i, i); // 奇数 string s2 expand(s, i, i1); // 偶数 if(s1.size() res.size()) res s1; if(s2.size() res.size()) res s2; } return res; } int main() { string str; cin str; cout longestPalindrome(str) endl; return 0; }暴力写法容易超时仅理解用枚举所有左右区间判断是否回文记录最长。 字符串较长时 TLE不推荐考场使用。cpp运行#include iostream #include string using namespace std; bool isPal(string s) { int l 0, r s.size()-1; while(l r) { if(s[l] ! s[r]) return false; l; r--; } return true; } int main() { string s; cin s; string ans; int n s.size(); for(int i 0; i n; i) { for(int j i; j n; j) { string sub s.substr(i, j-i1); if(isPal(sub) sub.size() ans.size()) ans sub; } } cout ans endl; return 0; }谢谢