LeetCode 第 165 场周赛
LeetCode 第 165 场周赛
C 暴力做的,只能说数据不充分
找出井字棋的获胜者4
题目描述 Description
A 和 B 在一个 3 x 3 的网格上玩井字棋。
井字棋游戏的规则如下:
玩家轮流将棋子放在空方格 (" ") 上。
第一个玩家 A 总是用 "X" 作为棋子,而第二个玩家 B 总是用 "O" 作为棋子。
"X" 和 "O" 只能放在空方格中,而不能放在已经被占用的方格上。
只要有 3 个相同的(非空)棋子排成一条直线(行、列、对角线)时,游戏结束。
如果所有方块都放满棋子(不为空),游戏也会结束。
游戏结束后,棋子无法再进行任何移动。
给你一个数组 moves,其中每个元素是大小为 2 的另一个数组(元素分别对应网格的行和列),它按照 A 和 B 的行动顺序(先 A 后 B)记录了两人各自的棋子位置。
如果游戏存在获胜者(A 或 B),就返回该游戏的获胜者;如果游戏以平局结束,则返回 "Draw";如果仍会有行动(游戏未结束),则返回 "Pending"。
你可以假设 moves 都 有效(遵循井字棋规则),网格最初是空的,A 将先行动。
样例输入与样例输出 Sample Input and Sample Output
示例 1:
输入:moves = [[0,0],[2,0],[1,1],[2,1],[2,2]]
输出:"A"
解释:"A" 获胜,他总是先走。
"X " "X " "X " "X " "X "
" " -> " " -> " X " -> " X " -> " X "
" " "O " "O " "OO " "OOX"
示例 2:
输入:moves = [[0,0],[1,1],[0,1],[0,2],[1,0],[2,0]]
输出:"B"
解释:"B" 获胜。
"X " "X " "XX " "XXO" "XXO" "XXO"
" " -> " O " -> " O " -> " O " -> "XO " -> "XO "
" " " " " " " " " " "O "
示例 3:
输入:moves = [[0,0],[1,1],[2,0],[1,0],[1,2],[2,1],[0,1],[0,2],[2,2]]
输出:"Draw"
输出:由于没有办法再行动,游戏以平局结束。
"XXO"
"OOX"
"XOX"
示例 4:
输入:moves = [[0,0],[1,1]]
输出:"Pending"
解释:游戏还没有结束。
"X "
" O "
" "
提示 Hint
提示:
1 <= moves.length <= 9
moves[i].length == 2
0 <= moves[i][j] <= 2
moves 里没有重复的元素。
moves 遵循井字棋的规则。
题解
模拟即可,考虑到 3x3 有看到位运算的做法
代码
class Solution {
public:
int run(int g[3][3], vector<int>&move, int val) {
g[move[0]][move[1]] = val;
int t = 0, ans = 0;
for(int i = move[0]; i < 3; ++i) {
if(g[i][move[1]] == val)
t++;
else
break;
}
for(int i = move[0] - 1; i >= 0; --i) {
if(g[i][move[1]] == val)
t++;
else
break;
}
ans = max(ans, t);
t = 0;
for(int i = move[1]; i < 3; ++i) {
if(g[move[0]][i] == val)
t++;
else
break;
}
for(int i = move[1] - 1; i >= 0; --i) {
if(g[move[0]][i] == val)
t++;
else
break;
}
ans = max(ans, t);
t = 0;
for(int i = 0; i + move[0] < 3 && i + move[1] < 3; ++i) {
if(g[i + move[0]][i + move[1]] == val)
t++;
else
break;
}
for(int i = -1; i + move[0] >= 0 && i + move[1] >= 0; --i) {
if(g[i + move[0]][i + move[1]] == val)
t++;
else
break;
}
ans = max(ans, t);
t = 0;
for(int i = 0; i + move[0] < 3 && move[1] - i >= 0; ++i) {
if(g[i + move[0]][-i + move[1]] == val)
t++;
else
break;
}
for(int i = -1; i + move[0] >= 0 && move[1] - i < 3 ; --i) {
if(g[i + move[0]][-i + move[1]] == val)
t++;
else
break;
}
ans = max(ans, t);
t = 0;
return ans;
}
bool finished(int g[3][3]) {
for(int i = 0; i < 3; ++i)
for(int j = 0; j < 3; ++j)
if(g[i][j] == 0)
return false;
return true;
}
string tictactoe(vector<vector<int>>& moves) {
int g[3][3];
memset(g, 0, sizeof(g));
for(int i = 0, n = moves.size(); i < n; ++i) {
if(run(g, moves[i], i % 2 + 1) > 2)
return (i & 1) ? string("B") : string("A");
}
return finished(g) ? string("Draw") : string("Pending");
}
};
不浪费原料的汉堡制作方案4
题目描述 Description
圣诞活动预热开始啦,汉堡店推出了全新的汉堡套餐。为了避免浪费原料,请你帮他们制定合适的制作计划。
给你两个整数 tomatoSlices 和 cheeseSlices,分别表示番茄片和奶酪片的数目。不同汉堡的原料搭配如下:
巨无霸汉堡:4 片番茄和 1 片奶酪
小皇堡:2 片番茄和 1 片奶酪
请你以 [total_jumbo, total_small]([巨无霸汉堡总数,小皇堡总数])的格式返回恰当的制作方案,使得剩下的番茄片 tomatoSlices 和奶酪片 cheeseSlices 的数量都是 0。
如果无法使剩下的番茄片 tomatoSlices 和奶酪片 cheeseSlices 的数量为 0,就请返回 []。
样例输入与样例输出 Sample Input and Sample Output
示例 1:
输入:tomatoSlices = 16, cheeseSlices = 7
输出:[1,6]
解释:制作 1 个巨无霸汉堡和 6 个小皇堡需要 41 + 26 = 16 片番茄和 1 + 6 = 7 片奶酪。不会剩下原料。
示例 2:
输入:tomatoSlices = 17, cheeseSlices = 4
输出:[]
解释:只制作小皇堡和巨无霸汉堡无法用光全部原料。
示例 3:
输入:tomatoSlices = 4, cheeseSlices = 17
输出:[]
解释:制作 1 个巨无霸汉堡会剩下 16 片奶酪,制作 2 个小皇堡会剩下 15 片奶酪。
示例 4:
输入:tomatoSlices = 0, cheeseSlices = 0
输出:[0,0]
示例 5:
输入:tomatoSlices = 2, cheeseSlices = 1
输出:[0,1]
提示 Hint
提示:
0 <= tomatoSlices <= 10^7
0 <= cheeseSlices <= 10^7
题解
先考虑全部用作小皇堡,剩下的每 2 片番茄将一个小皇堡换成巨无霸汉堡。注意边界和特判。
代码
class Solution {
public:
vector<int> numOfBurgers(int tomatoSlices, int cheeseSlices) {
if(tomatoSlices > cheeseSlices * 4)
return vector<int> {};
vector<int> ans(2);
ans[1] = cheeseSlices;
tomatoSlices -= 2 * cheeseSlices;
if(tomatoSlices < 0 || (tomatoSlices & 1))
return vector<int> {};
ans[1] -= tomatoSlices / 2;
ans[0] += tomatoSlices / 2;
tomatoSlices -= tomatoSlices - (tomatoSlices & 1);
if(tomatoSlices != 0)
return vector<int> {};
return ans;
}
};
统计全为 1 的正方形子矩阵5
题目描述 Description
给你一个 m * n 的矩阵,矩阵中的元素不是 0 就是 1,请你统计并返回其中完全由 1 组成的 正方形 子矩阵的个数。
样例输入与样例输出 Sample Input and Sample Output
示例 1:
输入:matrix =
[
[0,1,1,1],
[1,1,1,1],
[0,1,1,1]
]
输出:15
解释:
边长为 1 的正方形有 10 个。
边长为 2 的正方形有 4 个。
边长为 3 的正方形有 1 个。
正方形的总数 = 10 + 4 + 1 = 15.
示例 2:
输入:matrix =
[
[1,0,1],
[1,1,0],
[1,1,0]
]
输出:7
解释:
边长为 1 的正方形有 6 个。
边长为 2 的正方形有 1 个。
正方形的总数 = 6 + 1 = 7.
提示 Hint
1 <= arr.length <= 300
1 <= arr[0].length <= 300
0 <= arr[i][j] <= 1
题解
暴力可过,显然数据强度不够。
代码
class Solution {
public:
int n, m;
int countSquares(vector<vector<int>>& matrix) {
n = matrix.size(), m = matrix[0].size();
int ans(0);
for(int i = 1, c; i <= min(n, m); ++i) {
c = count(matrix, i);
ans += c;
if(!c)
break;
}
return ans;
}
int count(vector<vector<int> >&matrix, int edgeLen) {
int ans(0);
for(int i = 0; i < n - edgeLen + 1; ++i) {
for(int j = 0; j < m - edgeLen + 1; ++j)
if(isSquareAllOne(matrix, i, j, edgeLen))
ans++;
}
return ans;
}
bool isSquareAllOne(vector<vector<int>>&matrix, int x, int y, int edgeLen) {
for(int i = 0; i < edgeLen; ++i) {
for(int j = 0; j < edgeLen; ++j)
if(!matrix[x + i][y + j])
return false;
}
return true;
}
};
分割回文串 III
题目描述 Description
给你一个由小写字母组成的字符串 s,和一个整数 k。
请你按下面的要求分割字符串:
首先,你可以将 s 中的部分字符修改为其他的小写英文字母。
接着,你需要把 s 分割成 k 个非空且不相交的子串,并且每个子串都是回文串。
请返回以这种方式分割字符串所需修改的最少字符数。
样例输入与样例输出 Sample Input and Sample Output
示例 1:
输入:s = "abc", k = 2
输出:1
解释:你可以把字符串分割成 "ab" 和 "c",并修改 "ab" 中的 1 个字符,将它变成回文串。
示例 2:
输入:s = "aabbc", k = 3
输出:0
解释:你可以把字符串分割成 "aa"、"bb" 和 "c",它们都是回文串。
示例 3:
输入:s = "leetcode", k = 8
输出:0
提示 Hint
1 <= k <= s.length <= 100
s 中只含有小写英文字母。
题解
dp[i][j] 表示以 i 结尾,分成 j 段的最少修改次数。枚举上一段结尾的位置 pre,dp[i][j] = min(dp[i][j],dp[pre][j-1])
代码
class Solution {
public:
int palindromePartition(string s, int k) {
int dp[s.length()][k + 1];
memset(dp, 0x3f, sizeof(dp));
for(int i = 0; i < s.length(); ++i) { // end with s[i]
for(int j = 1; j <= k && j <= i + 1; ++j) { // has j segments
if(j == 1)
dp[i][j] = transferCost(s, 0, i);
else
for(int pre = max(j - 2, 0); pre < i; ++pre) {
dp[i][j] = min(dp[i][j], dp[pre][j - 1] + transferCost(s, pre + 1, i));
}
}
}
return dp[s.length() - 1][k];
}
int transferCost(string s, int l, int r) {
int ans(0);
for(int i = 0; i < (r - l + 1) / 2; ++i)
if(s[i + l] != s[r - i])
ans++;
return ans;
}
};
LeetCode 第 165 场周赛的更多相关文章
- Leetcode第 217 场周赛(思维量比较大)
Leetcode第 217 场周赛 比赛链接:点这里 做完前两题我就知道今天的竞赛我已经结束了 这场比赛思维量还是比较大的. 1673. 找出最具竞争力的子序列 题目 给你一个整数数组 nums 和一 ...
- Leetcode 第133场周赛解题报告
今天参加了leetcode的周赛,算法比赛,要求速度比较快.有思路就立马启动,不会纠结是否有更好的方法或代码可读性.只要在算法复杂度数量级内,基本上是怎么实现快速就怎么来了. 比赛时先看的第二题,一看 ...
- LeetCode第151场周赛(Java)
这是我第一次写周赛的题目,而且还是虚拟的.从这次起,以后就将所有错过的题目都写到博客来.当然既然是我错的,那代码肯定不是我自己的.我会注明来源.并且我会自己敲一遍.多总结总是没坏处的. 另外比较糟糕的 ...
- LeetCode第152场周赛(Java)
这算是我第一次正式参加 LeetCode 的周赛吧.通过两道题.意料之中(通过上次模拟可以看出来).总的来说,脑袋还是不太灵光.想的有点慢.全球第一名 0:10:19 就全部通过...感觉我的智商被狠 ...
- Leetcode 第137场周赛解题报告
今天的比赛的题目相对来说比较「直白」,不像前几周都是一些特定的算法,如果你没学过不可能想出来. 做了这些周,对leetcode比赛的题目也发现了一些「规律」. 一般前两道题都很「简单」,只要有想法,直 ...
- LeetCode 第 150 场周赛
一.拼写单词(LeetCode-1160) 1.1 题目描述 1.2 解题思路 由于给定的chars,每个字母只能用一次,所以用大小为26的数组charsArray来表示a-z(例如charsArra ...
- LeetCode 第 196 场周赛 (题目:5452-5455,这是参加过最坑的周赛,暴力n^2居然可以过)
5452. 判断能否形成等差数列 给你一个数字数组 arr . 如果一个数列中,任意相邻两项的差总等于同一个常数,那么这个数列就称为 等差数列 . 如果可以重新排列数组形成等差数列,请返回 tru ...
- Leetcode 第136场周赛解题报告
周日的比赛的时候正在外面办事,没有参加.赛后看了下题目,几道题除了表面要考的内容,还是有些能发散扩展的地方. 做题目不是最终目的,通过做题发现知识盲区,去研究学习,才能不断提高. 理论和实际是有关系的 ...
- Leetcode 第135场周赛解题报告
这周比赛的题目很有特点.几道题都需要找到一定的技巧才能巧妙解决,和以往靠数据结构的题目不太一样. 就是如果懂原理,代码会很简单,如果暴力做,也能做出来,但是十分容易出错. 第四题还挺难想的,想了好久才 ...
随机推荐
- LOJ #121. 「离线可过」动态图连通性 LCT维护最大生成树
这个还是比较好理解的. 你考虑如果所有边构成一棵树的话直接用 LCT 模拟一波操作就行. 但是可能会出现环,于是我们就将插入/删除操作按照时间排序,然后依次进行. 那么,我们就要对我们维护的生成树改变 ...
- Vue-es6基础语法
什么是ES6 ECMAScript 6 简称ES6, 在2015年6月正式发布~ ECMAScript 是JavaScript语言的国际标准. 我们本着二八原则,掌握好常用的,有用的~能让我们更快的 ...
- MySQL数据分析-(15)表补充:存储引擎
大家好,我是jacky,很高兴继续跟大家分享<MySQL数据分析实战>,今天跟大家分享的主题是表补充之存储引擎: 我们之前学了跟表结构相关的一些操作,那我们看一下创建表的SQL模型: 在我 ...
- OpenFOAM 中的边界条件(一)【转载】
链接:http://xiaopingqiu.github.io/2016/04/02/Boundary-conditions-in-OpenFOAM1/ 本系列解读 OpenFOAM 中边界条件的实现 ...
- 子线程里调用performSelector需要注意什么
以下代码执行顺序是什么 ? - (void)action { NSLog(@"1"); dispatch_queue_t queue = dispatch_get_global_q ...
- 互联网IT当线上出现 bug 时,是怎么处理的?
线上BUG说处理方法:1.关于线上BUG问题,目前公司有一整套线上故障流程规范,包括故障定义.定级.处理流程.故障处理超时升级机制.故障处理小组.故障处罚(与故障存在时长有关)等:2.最主要的是,线上 ...
- csp-s模拟109
这场考试状态是极差,也因而无畏地打下了三个乱搞.然而这场确实挺乱搞.T1状压但我没优化而选择循环展开,T2打$bitset$随机化(考场上打的有问题不是随机但也能A),T3贪心骗分.但是因为状态实在太 ...
- Hive-概述
Hive:由 Facebook 开源用于解决海量结构化日志的数据统计. Hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类 SQL 查询功能. 本质是:将 ...
- WebView调用js方法获取返回值的完美解决方案
在Android项目中我们或多或少会涉及到与js交互的问题,这其中WebView是必须掌握的控件,今天主要说说我们通过WebView调用js方法,然后如何很好的获取返回值.这里我总结了三种方式,大家可 ...
- 如何查看linux内核中驱动的初始化顺序?
答:通过生成的System.map可以查看到,主要关注__initcall_<module_entry_function>_init<level>,如: __initcall_ ...