当前位置: 首页 > article >正文

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;
}

运行结果: 

 

 

 


http://www.kler.cn/a/509019.html

相关文章:

  • 机器学习:监督学习与非监督学习
  • cursor重构谷粒商城02——30分钟构建图书管理系统【cursor使用教程番外篇】
  • “扣子”开发之四:与千帆AppBuilder比较
  • 一次完整的tcpdump -XX输出报文详解
  • Web3 时代,区块链与物联网的融合创新前景
  • APISQL在线一键安装教程
  • 二叉树总结(hot100)
  • 物联网通信协议对比-带表格
  • R数据分析:有调节的中介与有中介的调节的整体介绍
  • [ Spring ] Install Nacos on Ubuntu24
  • 【汇编语言】直接定址表(一)—— 「从单元标号到跨段数据:解锁汇编语言的隐藏技巧」
  • 【Rust自学】13.4. 闭包 Pt.4:使用闭包捕获环境
  • 信贷业务术语详解:深入理解金融领域的核心概念
  • js常用操作符
  • macOS安装的Ubuntu 20 VM虚拟机扩充磁盘的便捷方式
  • OpenWRT Conserver 共享串口服务实现
  • Linux UDP 编程详解
  • B3DM转换成XYZ
  • AI面试官
  • 深入HDFS——数据上传源码
  • wireshark上没有显示出来rtp协议如何处理
  • 群论学习笔记
  • Windows图形界面(GUI)-QT-C/C++ - Qt Table Widget详解教程
  • 【深度学习】Pytorch:在 ResNet 中加入注意力机制
  • 架构思考与实践:从通用到场景的转变
  • AI的出现,是否能替代IT从业者?