#P2330. 第1题-扑克牌
-
ID: 1544
Tried: 1181
Accepted: 469
Difficulty: 4
所属公司 :
华为
时间 :2024年4月17日-暑期实习
第1题-扑克牌
题面描述:
塔子哥通过一种三消游戏来测试你的能力,他从一副扑克牌中随机抽取了n张牌,形成一个序列,规则是连续3张相同的牌可以消除,剩下的牌会重新合并成新序列,继续进行消除,直到无法再消除为止。输入包括一个整数n表示牌的数量,以及一个以空格分隔的牌号序列(仅包含2-10,A,J,Q,K)。输出最后剩余的牌序列,若所有牌都被消除则输出0
。
思路
模拟这一消除过程。
具体来说,在发现连续的三个相同字符时,删除这三个字符,并将右边字符向左移动。移动后可能仍旧会发生三消,重复判断即可。
下面的代码中使用vector在读入的过程中模拟该过程。
实现思路
- 使用
vector
存储牌:在C++中,使用动态数组vector
可以方便地对牌进行增删操作。 - 读取输入:通过循环读取牌号并存入
vector
中。 - 消除逻辑:在每次添加新牌后,检查
vector
的末尾是否存在连续三张相同的牌。如果存在,则将这三张牌消除,并继续检查消除后的新末尾,直到没有三张相同的牌为止。 - 输出结果:最终检查
vector
是否为空,若为空输出0
,否则输出剩余的牌。
细节说明
- 消除过程的效率:每次消除操作都会影响到后续的牌,这可能导致新的三消机会,因此需要在每次添加新牌后都进行检查。
- 处理输出:最后输出时需要注意格式,确保每张牌之间用空格分隔,最后一张牌后没有多余的空格。
- 边界条件:要考虑输入的最小值和最大值,确保代码在这些边界条件下也能正确运行。
代码
C++
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
int main (){
int n; cin >> n;
vector<string> s;
for(int i = 0; i < n; i ++)
{
string ch; cin >> ch;
s.push_back(ch);
int m = s.size();
while(s.size() >= 3 && (s[m - 1] == s[m - 2] && s[m - 2] == s[m - 3]))//重复判断是否存在三消
{
for(int j = 0; j < 3; j ++)
s.pop_back();
m = s.size();
}
}
int m = s.size();
if(!m)
cout << 0 << "\n";
else
{
for(int i = 0; i < m; i ++)
cout << s[i] << " \n"[i == m - 1];
}
return 0;
}
python
n = int(input()) # 读取整数 n,表示牌的数量
a = input().split() # 读取输入的牌号,并使用空格分隔成一个列表
st = [] # 创建一个空列表,用于存储当前的牌序列
# 遍历每一张牌
for x in a:
st.append(x) # 将当前牌加入列表
# 检查列表中最后三张牌是否相同
if len(st) >= 3 and st[-1] == st[-2] == st[-3]:
# 如果存在连续的三张相同牌,则进行消除
for _ in range(3):
st.pop() # 消除最后三张相同的牌
# 检查最终的牌序列
if not st:
print(0) # 如果列表为空,表示所有牌都被消除,输出 0
else:
print(' '.join(st)) # 否则,将剩余的牌以空格分隔并输出
java
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = Integer.parseInt(scanner.nextLine()); // 读取牌的数量
String[] a = scanner.nextLine().split(" "); // 读取牌号,并使用空格分隔成一个字符串数组
List<String> st = new ArrayList<>(); // 创建一个动态数组,用于存储当前的牌序列
// 遍历每一张牌
for (String x : a) {
st.add(x); // 将当前牌加入列表
// 检查列表中最后三张牌是否相同
while (st.size() >= 3 && st.get(st.size() - 1).equals(st.get(st.size() - 2)) && st.get(st.size() - 2).equals(st.get(st.size() - 3))) {
// 如果存在连续的三张相同牌,则进行消除
for (int j = 0; j < 3; j++) {
st.remove(st.size() - 1); // 消除最后三张相同的牌
}
}
}
// 检查最终的牌序列
if (st.isEmpty()) {
System.out.println(0); // 如果列表为空,表示所有牌都被消除,输出 0
} else {
System.out.println(String.join(" ", st)); // 否则,将剩余的牌以空格分隔并输出
}
scanner.close(); // 关闭扫描器
}
}
javascript
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
void (async function () {
let n = parseInt(await readline()); // 读取牌的数量
let a = (await readline()).split(" "); // 读取牌号,并按空格拆分为数组
let st = []; // 使用数组模拟动态列表
// 遍历每一张牌
for (let x of a) {
st.push(x); // 将当前牌加入列表
// 检查列表中最后三张牌是否相同
while (st.length >= 3 && st[st.length - 1] === st[st.length - 2] && st[st.length - 2] === st[st.length - 3]) {
// 如果存在连续的三张相同牌,则进行消除
st.splice(-3, 3); // 删除最后三张牌
}
}
// 检查最终的牌序列
if (st.length === 0) {
console.log(0); // 如果列表为空,表示所有牌都被消除,输出 0
} else {
console.log(st.join(" ")); // 否则,输出剩余的牌
}
rl.close();
})();
题目描述
小明最新沉迷某三消游戏,现在的他已经是这方面的大神。你太想进步了,找到了小明并求他传授秘籍。他决定用一个游戏测试一下你的功底。
小明从一副扑克牌中随机抽取n张牌组成一个序列,规定:连续3张相同牌号的卡牌可以消除,剩余卡牌按照当前顺序重新合并成新的序列后继续消除,例如序列 01112 在消除 111 之后,余下 02,重复以上步骤直到无法消除,请你完成这个游戏,输出结束后剩余的卡牌序列。
注:存在连续4张相同牌号的情况,消除后剩余一张。
输入描述
第一行输入一个整数n,表示抽出扑克牌的数量。其中1≤n≤52。
第二行一个字符串,以空格分隔代表卡牌号序列,卡牌号仅包含2-10,A,J,Q,K
输出描述
输出一个字符串,表示最终的卡牌序列,卡牌号以空格分隔。
当所有扑克牌都被消除,输出0
样例一
输入
11
6 2 3 3 3 2 2 2 7 7 7
输出
6 2
样例二
输入
6
5 A A A 5 5
输出
0