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]

解题思路:

问题理解

题目描述了一个特殊的随机播放规则:

  1. 首先播放歌单中的第一首歌,并将其从歌单中移除。
  2. 如果歌单中还有歌曲,则将当前第一首歌移到最后一首。
  3. 重复上述过程,直到歌单中没有任何歌曲。

数据结构选择

为了实现这个播放规则,我们可以使用一个队列(Queue)来模拟歌单。队列的特点是先进先出(FIFO),非常适合模拟歌曲的播放顺序。

算法步骤

  1. 初始化:将所有歌曲放入队列中。
  2. 播放歌曲
    • 从队列中取出第一首歌,并将其加入结果列表。
    • 如果队列中还有歌曲,将当前队列的第一首歌移到队列的末尾。
  3. 重复:重复上述步骤,直到队列为空。

最终代码:

复制代码
#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

解题思路:

好的,让我们来分析一下这个问题的解题思路。

问题理解

你需要处理一个由数字和小写英文字母组成的字符串,目标是统计替换后剩下的不同整数的数目。具体步骤如下:

  1. 字符串处理:遍历字符串,将非数字字符替换为空格。
  2. 提取整数:在遍历过程中,将连续的数字字符拼接成整数。
  3. 去除前导零:对于提取出的整数,去除前导零。
  4. 去重 :使用集合(set)来存储不同的整数,确保每个整数只出现一次。
  5. 统计结果:最终集合的大小即为不同整数的数目。

数据结构选择

  • 集合(set:用于存储不同的整数,自动去重。
  • 字符串(string:用于临时存储拼接的数字。

算法步骤

  1. 初始化:创建一个集合用于存储不同的整数,创建一个字符串用于临时存储数字。
  2. 遍历字符串
    • 如果当前字符是数字,将其拼接到临时字符串中。
    • 如果当前字符不是数字,处理临时字符串中的数字:
      • 去除前导零。
      • 将处理后的数字加入集合。
      • 清空临时字符串。
  3. 处理最后一个数字:遍历结束后,如果临时字符串不为空,处理并加入集合。
  4. 返回结果:集合的大小即为不同整数的数目。

最终代码:

复制代码
#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;
}

运行结果:

相关推荐
2601_9638702212 小时前
基于Python的晋江文学城热门作品数据分析与可视化
开发语言·python·数据分析
Carlgood-Minecraft13 小时前
随机分位系统破解版 (BPS)Version-B4.2
c++
^yi13 小时前
【Linux系统编程】进程状态的理解
算法·僵尸进程·孤儿进程·进程状态·挂起状态·阻塞状态
其实防守也摸鱼13 小时前
Kimi K3深度测评:长文本之外的真实力
运维·开发语言·网络·人工智能·python·学习·安全
冻柠檬飞冰走茶13 小时前
PTA基础编程题目集 7-7 12-24小时制(C语言实现)
c语言·开发语言·数据结构·算法
梦幻通灵13 小时前
Java中finally失效的几种情况【持续更新】
java·开发语言
月落归舟14 小时前
SpringMVC 多种响应返回方式
java·开发语言
长不胖的路人甲14 小时前
二叉排序树(BST)Java 完整实现 + 删除思路详解
java·开发语言·算法
geovindu14 小时前
python: Breadth First Search Algorithm and Depth First Search Algorithm
开发语言·后端·python·算法·搜索算法
长不胖的路人甲14 小时前
可达性分析法(根搜索算法)完整详解
java·jvm·算法