Shuffle an Array随机与取样--力扣101算法题解笔记

9.5Shuffle an Array随机与取样

题目描述

给定一个数组,要求实现两个指令函数,第一个函数"shuffle"可以随机打乱这个数组,第二个函数"reset"可以恢复原来的顺序

输入输出样例

Input :nums = 1, 2, 3, actions: "shuffle", "shuffle", "reset"

Output:\[2,1,3, 3,2,1,1,2,3]

题解

采用景点的Fisher-Yates洗牌算法,原理是通过随机交换位置来实现随机打乱,有正向和反向两种写法,实现很简单。

cpp 复制代码
#include <iostream>
#include <vector>
using namespace std;

class Solution {
    vector<int> origin;
public:
    Solution(vector<int> nums) :origin(std::move(nums)) {}

    vector<int> reset() {
        return origin;
    }

    vector<int> shuffle() {
        if (origin.empty())  return {};
        vector<int> shuffled(origin);
        int n = origin.size();
        //反向洗牌
        for (int i = n - 1; i >= 0; --i) {
            swap(shuffled[i], shuffled[rand() % (i + 1)]);
        }
        //正向洗牌(跟反向效果一样)
        //for (int i = 0; i < n; ++i) {
        //    int pos = rand() % (n - i);
        //    swap(shuffled[i], shuffled[i + pos]);
        //}
        return shuffled;
    }
};

void printVector(const vector<int>& vec) {
    cout << "[";
    for (int i = 0; i < vec.size(); ++i) {
        cout << vec[i];
        if (i != vec.size() - 1) cout << ",";
    }
    cout << "]" << endl;
}

int main() {
    // 1. 初始化原始数组(对应样例输入nums = [1,2,3])
    vector<int> nums = { 1, 2, 3 };

    // 2. 创建Solution对象(注意:Solution solution(); 是函数声明,不是对象创建!)
    Solution solution(nums);

    // 3. 设置随机数种子(否则每次运行shuffle结果都一样)
    srand((unsigned)time(NULL));

    // 4. 模拟样例操作:shuffle → shuffle → reset
    cout << "第一次shuffle结果:";
    printVector(solution.shuffle()); // 输出随机打乱的数组(如[2,1,3])

    cout << "第二次shuffle结果:";
    printVector(solution.shuffle()); // 输出另一个随机打乱的数组(如[3,2,1])

    cout << "reset结果:";
    printVector(solution.reset());   // 输出原始数组[1,2,3]

    return 0;
}
相关推荐
彧azz1 小时前
算法设计与分析:贪心与动态规划
数据结构·学习·算法·贪心算法·动态规划
泡海椒1 小时前
PDF 表格样式优化:jquick-pdf 边框、圆角、背景色
java·开发语言·pdf
Beyond_System|系统之外2 小时前
【学编程】Python基础编程题100道(21-60)
开发语言·python·算法
景熙55232 小时前
15.Java 8 Stream 流入门到实战
java·开发语言·数据结构
汉克老师3 小时前
GESP2026年9月认证C++六级( 第三部分编程题(1、数组划分))精讲
c++·gesp·小学生·学c++编程
千里码aicood3 小时前
基于PLC与机器视觉的智能分拣控制系统设计
c++·自动化·plc
漂流瓶jz4 小时前
UVA-1442 洞穴 题解答案代码 算法竞赛入门经典第二版
c++·算法·题解·aoapc·算法竞赛入门经典·uva
朽棘不雕4 小时前
进一步了解模板
c++
Bruce_Liuxiaowei5 小时前
Python 实例赋值遮蔽类属性:一个从不报错的静默陷阱
开发语言·python·语法糖
叠层归一研究院5 小时前
基于极限自指的叠层归一宇宙结构理论——无元外部封闭系统的内生区分模型
人工智能·经验分享·算法·agi