AI刷题-小R的随机播放顺序、不同整数的计数问题
目录
一、小R的随机播放顺序
问题描述
测试样例
解题思路:
问题理解
数据结构选择
算法步骤
最终代码:
运行结果:
二、 不同整数的计数问题
问题描述
测试样例
解题思路:
问题理解
数据结构选择
算法步骤
最终代码:
运行结果:编辑
一、小R的随机播放顺序
问题描述
小R有一个特殊的随机播放规则。他首先播放歌单中的第一首歌,播放后将其从歌单中移除。如果歌单中还有歌曲,则会将当前第一首歌移到最后一首。这个过程会一直重复,直到歌单中没有任何歌曲。
例如,给定歌单 [5, 3, 2, 1, 4]
,真实的播放顺序是 [5, 2, 4, 1, 3]
。
保证歌曲中的id
两两不同。
测试样例
样例1:
输入:
n = 5 ,a = [5, 3, 2, 1, 4]
输出:[5, 2, 4, 1, 3]
样例2:
输入:
n = 4 ,a = [4, 1, 3, 2]
输出:[4, 3, 1, 2]
样例3:
输入:
n = 6 ,a = [1, 2, 3, 4, 5, 6]
输出:[1, 3, 5, 2, 6, 4]
解题思路:
问题理解
题目描述了一个特殊的随机播放规则:
- 首先播放歌单中的第一首歌,并将其从歌单中移除。
- 如果歌单中还有歌曲,则将当前第一首歌移到最后一首。
- 重复上述过程,直到歌单中没有任何歌曲。
数据结构选择
为了实现这个播放规则,我们可以使用一个队列(Queue)来模拟歌单。队列的特点是先进先出(FIFO),非常适合模拟歌曲的播放顺序。
算法步骤
- 初始化:将所有歌曲放入队列中。
- 播放歌曲:
- 从队列中取出第一首歌,并将其加入结果列表。
- 如果队列中还有歌曲,将当前队列的第一首歌移到队列的末尾。
- 重复:重复上述步骤,直到队列为空。
最终代码:
#include <iostream>
#include <vector>
#include <queue> // 引入队列头文件
std::vector<int> solution(int n, std::vector<int> a) {
std::vector<int> result; // 用于存储播放顺序
std::queue<int> songQueue; // 用于模拟歌单的队列
// 将所有歌曲放入队列中
for (int song : a) {
songQueue.push(song);
}
// 模拟播放过程
while (!songQueue.empty()) {
// 取出队列中的第一首歌,并将其加入结果列表
int currentSong = songQueue.front();
songQueue.pop();
result.push_back(currentSong);
// 如果队列中还有歌曲,将当前队列的第一首歌移到队列的末尾
if (!songQueue.empty()) {
int nextSong = songQueue.front();
songQueue.pop();
songQueue.push(nextSong);
}
}
return result; // 返回最终的播放顺序
}
int main() {
std::vector<int> result1 = {5, 2, 4, 1, 3};
std::vector<int> result2 = {4, 3, 1, 2};
std::vector<int> result3 = {1, 3, 5, 2, 6, 4};
std::cout << (solution(5, {5, 3, 2, 1, 4}) == result1) << std::endl;
std::cout << (solution(4, {4, 1, 3, 2}) == result2) << std::endl;
std::cout << (solution(6, {1, 2, 3, 4, 5, 6}) == result3) << std::endl;
}
运行结果:
二、 不同整数的计数问题
问题描述
小R有一个字符串 word
,该字符串由数字和小写英文字母组成。小R想用空格替换每一个不是数字的字符。然后,他希望统计在替换后剩下的整数中,不同整数的数目。
例如,给定字符串 "a123bc34d8ef34"
,替换后形成的字符串是 " 123 34 8 34"
,剩下的整数是 "123"
、"34"
、"8"
和 "34"
。不同的整数有三个,即 "123"
、"34"
和 "8"
。
注意,只有当两个整数的不含前导零的十进制表示不同,才认为它们是不同的整数。
测试样例
样例1:
输入:
word = "a123bc34d8ef34"
输出:3
样例2:
输入:
word = "t1234c23456"
输出:2
样例3:
输入:
word = "a1b01c001d4"
输出:2
解题思路:
好的,让我们来分析一下这个问题的解题思路。
问题理解
你需要处理一个由数字和小写英文字母组成的字符串,目标是统计替换后剩下的不同整数的数目。具体步骤如下:
- 字符串处理:遍历字符串,将非数字字符替换为空格。
- 提取整数:在遍历过程中,将连续的数字字符拼接成整数。
- 去除前导零:对于提取出的整数,去除前导零。
- 去重:使用集合(
set
)来存储不同的整数,确保每个整数只出现一次。 - 统计结果:最终集合的大小即为不同整数的数目。
数据结构选择
- 集合(
set
):用于存储不同的整数,自动去重。 - 字符串(
string
):用于临时存储拼接的数字。
算法步骤
- 初始化:创建一个集合用于存储不同的整数,创建一个字符串用于临时存储数字。
- 遍历字符串:
- 如果当前字符是数字,将其拼接到临时字符串中。
- 如果当前字符不是数字,处理临时字符串中的数字:
- 去除前导零。
- 将处理后的数字加入集合。
- 清空临时字符串。
- 处理最后一个数字:遍历结束后,如果临时字符串不为空,处理并加入集合。
- 返回结果:集合的大小即为不同整数的数目。
最终代码:
#include <iostream>
#include <string>
#include <set>
using namespace std;
int solution(string word) {
// PLEASE DO NOT MODIFY THE FUNCTION SIGNATURE
// write code here
set<string> unidqueNumbers; //用集合存储不同的整数
string currentNumber = ""; // 临时变量,用来拼接数字
for (char ch : word) {
if (isdigit(ch)) {
currentNumber += ch;
} else {
// 如果遇到非数字字符,处理当前数字
if (!currentNumber.empty()) {
// 去除前导零并加入到 set 中
while (currentNumber.size() > 1 && currentNumber[0] == '0') {
// 表示从位置0开始删除一个字符
currentNumber.erase(0, 1);
}
unidqueNumbers.insert(currentNumber);
currentNumber = "";
}
}
}
// 遇到非数字才会处理数字,所以要处理字符串最后的数字
if (!currentNumber.empty()) {
// 去除前导零并加入到 set 中
while (currentNumber.size() > 1 && currentNumber[0] == '0') {
// 表示从位置0开始删除一个字符
currentNumber.erase(0, 1);
}
unidqueNumbers.insert(currentNumber);
}
return unidqueNumbers.size();
}
int main() {
cout << (solution("a123bc34d8ef34") == 3) << endl;
cout << (solution("t1234c23456") == 2) << endl;
cout << (solution("a1b01c001d4") == 2) << endl;
return 0;
}
运行结果: