华为OD机试 2025B卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。
一、题目描述
游戏规则:
输入一个只包含英文字母的字符串,字符串中的两个字母如果相邻且相同,就可以消除。在字符串上反复执行消除的动作,直到无法继续消除为止,此时游戏结束输出最终得到的字符串长度。
二、输入描述
输入原始字符串str,只能包含大小写英文字母,字母的大小写敏感,str长度不超过100。
三、输出描述
输出游戏结束后,最终得到的字符串长度。
四、测试用例
测试用例1:
1、输入
aaAAaa
2、输出
0
3、说明
原字符串:a a A A a a
消除过程:
“aa” 被消除,剩下 “A A a a”
“AA” 被消除,剩下 “a a”
“aa” 被消除,最终字符串为空,长度为0。
测试用例2:
1、输入
aabccbaA
2、输出
2
3、说明
原字符串:a a b c c b a A
消除过程:
- “aa” 被消除,剩下 “b c c b a A”
- “cc” 被消除,剩下 “b b a A”
- “bb” 被消除,剩下 “a A”
- 无法继续消除,最终长度为2。
五、解题思路
- 由于栈:后进先出的特效,首先要能想到应用栈Stack;
- 通过peek()获取最新的字母,与下一个字母进行比较,看是否可以消除;
- 如果相等,则通过pop()弹出;
- 否则将字母压入栈中;
六、Python算法源码
def final_string_length(s):
"""
使用栈来消除相邻重复字符,返回最终字符串的长度
"""
stack = []
for c in s:
if stack and stack[-1] == c:
stack.pop() # 消除相邻重复字符
else:
stack.append(c) # 压入栈中
return len(stack)
if __name__ == "__main__":
s = input().strip()
print(final_string_length(s))
七、JavaScript算法源码
function finalStringLength(s) {
/**
* 使用数组模拟栈,消除相邻重复字符,返回最终字符串的长度
*/
const stack = [];
for (let c of s) {
if (stack.length > 0 && stack[stack.length - 1] === c) {
stack.pop(); // 消除相邻重复字符
} else {
stack.push(c); // 压入栈中
}
}
return stack.length;
}
// 读取输入并输出结果
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.on('line', (input) => {
console.log(finalStringLength(input.trim()));
rl.close();
});
八、C算法源码
#include <stdio.h>
#include <string.h>
#define MAX 101
int main() {
char str[MAX];
char stack[MAX];
int top = -1;
// 读取输入字符串
scanf("%s", str);
int len = strlen(str);
for(int i = 0; i < len; i++) {
char c = str[i];
if(top >= 0 && stack[top] == c) {
top--; // 消除相邻重复字符
}
else {
stack[++top] = c; // 压入栈中
}
}
// 输出最终字符串长度
printf("%d\n", top + 1);
return 0;
}
九、C++算法源码
#include <bits/stdc++.h>
using namespace std;
int main(){
string str;
cin >> str;
/**
* 使用栈来消除相邻重复字符
*/
stack<char> s;
for(char c : str){
if(!s.empty() && s.top() == c){
s.pop(); // 消除相邻重复字符
}
else{
s.push(c); // 压入栈中
}
}
// 输出最终字符串长度
cout << s.size() << endl;
return 0;
}
🏆下一篇:华为OD机试真题 - 简易内存池(Python/JS/C/C++ 2025 B卷 200分)
🏆本文收录于,华为OD机试真题(Python/JS/C/C++)
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。