leetcode384

leetcode384

这个题目的要求是给定一个数组[1,2,3]能够写出resetshuffle,调shuffle的时候就返回它的一个shuffle,调reset的时候就重置回到原来的。 其实这在实际中常常见到,比如在训练模型的时候,希望数据以怎样的方式出场,是shuffle的出场还是怎么样,那当数据跑完一个epoch之后,所以数据就要reset回到原来的顺序,然后再shuffle的出来。

实现1.

class Solution(object):

    def __init__(self, nums):
        """
        :type nums: List[int]
        """
        self.nums = nums
        ori = []
        ori[:] = nums
        self.ori = ori
        

    def reset(self):
        """
        Resets the array to its original configuration and return it.
        :rtype: List[int]
        """
        return self.ori
        

    def shuffle(self):
        """
        Returns a random shuffling of the array.
        :rtype: List[int]
        """
        if len(self.nums)==0:
            return []
        import numpy as np
        idx = np.random.choice(range(len(self.nums)), len(self.nums), replace=False)
        return [self.nums[i] for i in idx]

上面我是用了numpy里面的choice来操作的。但是实际上写的麻烦了,reset可以直接写成’return self.nums’,初始化里面可以只是self.nums=nums,因为这时候我并没有对self.nums进行操作,它是不会变的。

实现2

也可以这样写

import random

class Solution:
    
    def __init__(self, nums):
        self.nums = nums

    def reset(self):
        return self.nums

    def shuffle(self):
        return sorted(self.nums, key=lambda x: random.random())          

但是下面这样写就不行

class Solution(object):

    def __init__(self, nums):
        """
        :type nums: List[int]
        """
        self.nums = nums

    def reset(self):
        """
        Resets the array to its original configuration and return it.
        :rtype: List[int]
        """
        return self.nums
        

    def shuffle(self):
        """
        Returns a random shuffling of the array.
        :rtype: List[int]
        """
        import random
        random.shuffle(self.nums)
        return self.nums
        

因为在shuffle里面已经改变了self.nums,所以再reset的时候就和之前shuffle之后的是一样的了。测试结果如下

[4, 8, 3, 0, 5, 1, 2, 7, 9, 6]
[4, 8, 3, 0, 5, 1, 2, 7, 9, 6]
[1, 6, 9, 0, 4, 7, 2, 3, 8, 5]
[1, 6, 9, 0, 4, 7, 2, 3, 8, 5]

shuffle-->reset-->shuffle-->reset调的。传入的是range(10).

改成下面的就可以了,即把原来的copy一份。

class Solution(object):

    def __init__(self, nums):
        """
        :type nums: List[int]
        """
        self.nums = nums

    def reset(self):
        """
        Resets the array to its original configuration and return it.
        :rtype: List[int]
        """
        return self.nums
        

    def shuffle(self):
        """
        Returns a random shuffling of the array.
        :rtype: List[int]
        """
        import random
        a = []
        a[:]=self.nums
        random.shuffle(a)
        return a
        

注意上面的a[:]改成a就不对了。

c++

用c++可以这样写

class Solution {
    vector<int> ori;
public:
    Solution(vector<int> nums):ori{nums}{
        
    }
    
    /** Resets the array to its original configuration and return it. */
    vector<int> reset() {
        return ori;
        
    }
    
    /** Returns a random shuffling of the array. */
    vector<int> shuffle() {
        vector<int> a{ori};
        random_shuffle(a.begin(), a.end());
        return a;
    }
};

其中random_shuffle是std里面的。

打赏,谢谢~~

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,多谢支持~

打开微信扫一扫,即可进行扫码打赏哦