思路如下:
1、重设数组,只需要定义一个int的orignal数组存储初始的nums即可。需要特别注意,在重设的时候,将original赋给nums之后,需要重新对orignal调用clone()方法指向一个新的地址,否则会因为对nums的修改,使得orignal也被修改
2、打乱数组,应用洗牌算法即可
洗牌算法
class Solution {
//将传入的nums放入array中变为全局变量
int[] array;
//存储nums的原始值
int[] original_nums;
Random r=new Random();
public Solution(int[] nums) {
array=nums;
original_nums=nums.clone();
}
/** Resets the array to its original configuration and return it. */
public int[] reset() {
array=original_nums;
//将original赋给nums之后,需要重新对orignal调用clone()方法指向一个新的地址,否则会因为对nums的修改,使得orignal也被修改
original_nums=original_nums.clone();
return array;
}
/** Returns a random shuffling of the array. */
public int[] shuffle() {
//洗牌算法。
for(int i=0;i<array.length;i++){
//在每次迭代中,生成一个范围在当前下标到数组末尾元素下标之间的随机整数
int index=r.nextInt(array.length-i)+i;
//交换当前元素与随机元素
int temp=array[index];
array[index]=array[i];
array[i]=temp;
}
return array;
}
}
/**
* Your Solution object will be instantiated and called as such:
* Solution obj = new Solution(nums);
* int[] param_1 = obj.reset();
* int[] param_2 = obj.shuffle();
*/
原题地址:
384. 打乱数组