题目:给定一个长度为N的数组,里面的每一个元素的值都在0到N-1之间,并且
数组的元素是各不相同的。重新排列这个数组,使得array[i]的值变成array[array[i]], 但是只能使用
0(1)的额外空间。
实现的代码如下:
import java.util.Arrays;
/**
* <pre>
* 题目要求:重新排列一个数组,使得array[i]的值变成array[array[i]],
* 只能使用0(1)的额外空间。
*
* 題目描述:给定一个长度为N的数组,里面的每一个元素的值都在0到N-1之间,并且数组的元素是各不相同的。重新排列
* 这个数组,使得array[i]的值变成array[array[i]], 但是只能使用0(1)的额外空间。
* </pre>
*
* 例如:
*
* {3, 2, 0, 1} ==> {1, 0, 3, 2}
*
* {4, 0, 2, 1, 3} ==> {3, 4, 2, 0, 1}
*
* {0, 1, 2, 3} ==> {0, 1, 2, 3}
*
* ...
*
* @author Eric
*
*/
public class RearrangeArray {
/**
* 重新排列一个给定的数组,使得array[i]的值变成array[array[i]], 但是只能使用0(1)的额外空间。
*/
public int[] rearrange(int[] array) {
if (null == array) {
throw new IllegalArgumentException("数组不是为NULL.");
}
if (!(isArrayExpected(array.clone()))) {
throw new IllegalArgumentException(
"长度为N的数组,里面的每一个元素的值都在0到N-1之间,并且数组的元素是各不相同的。");
}
int len = array.length;
/*
* 每个位置的元素都增加一个值,这个值为(array[array[i]] % N) * N
*
* 这样做的好处是让每个元素同时拥有旧的和新的值。
*
* oldValue = array[i] % N, newValue = array[i] / N
*/
for (int i = 0; i < len; i++) {
array[i] += (array[array[i]] % len) * len;
}
/*
* 计算新的值,newValue = array[i] / N
*/
for (int i = 0; i < len; i++) {
array[i] /= len;
}
return array;
}
/**
* 判断待处理的整形数组其所拥有的元素是否符合要求。
*/
private boolean isArrayExpected(int[] array) {
Arrays.sort(array);
/*
* 如果是符合要求数组,那么其排序后的结果将会是{0,1,2,3,...N-1}
*/
for (int i = 0; i < array.length; i++) {
if (i != array[i]) {
return false;
}
}
return true;
}
}
一个测试例子如下:
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
int[] origArray = { 3, 2, 0, 1 };
System.out.printf("原数组的内容是%s\n", Arrays.toString(origArray));
RearrangeArray ra = new RearrangeArray();
System.out.printf("变换后的数组内容是%s\n",
Arrays.toString(ra.rearrange(origArray)));
}
}
运行结果如下:
原数组的内容是[3, 2, 0, 1]
变换后的数组内容是[1, 0, 3, 2]
分享到:
相关推荐
如果想要生成与已有数组相同维数的全1或全0数组,可以使用`ones(size(array))`或`zeros(size(array))`。 2. 单位矩阵:使用`eye`函数生成,其功能类似于`ones`和`zeros`,但生成的是对角线上元素为1,其余位置为0的...
使用array_splice()函数删除元素后,数组中被删除元素的位置会被后面元素填补,而且数组会重新索引,使得剩余元素的索引连续。继续以同样的数组为例,如果使用array_splice($arr, 1, 1);来删除索引为1的元素,结果会...
- `$array`:需要被随机重排的数组。 - **返回值**: - 成功执行返回 `true`,失败则返回 `false`。 - **注意**: - `shuffle()` 会改变原始数组的键名,如果数组是关联数组,原有的键名将会丢失。 - 如果需要...
然而,要注意的是,如果需要保持原有数组的键值而不进行重置,可以使用其他方法,如 `+` 运算符或 `array_replace()` 函数,这些方法在处理关联数组时通常能更好地保留原始键。 总之,`array_merge()` 是PHP中一个...
这个算法是一种在线算法,即在原数组上进行操作,无需额外空间,且保证了每次打乱都是均匀分布的。以下是使用Fisher-Yates算法打乱数组的示例: ```javascript function shuffleArray(arr) { for (let i = arr....
复制代码 代码如下: function array_sort($array, $key){ if(is_array($array)){ ...for( $i = 0; $i < count xss=removed xss=removed xss=removed> $v){ $new_array[$j] = $array[$v]; $j++; } uns
10. **数组选择和布尔索引Boolean Indexing**: 可以使用布尔数组选择特定元素,如`array[array > 0]`。 **Pandas** 1. **DataFrame对象DataFrame**: DataFrame是一个二维表格型数据结构,具有列名和行索引,可以...
本文实例讲解了PHP数组排序中sort、asort与ksort的用法,供大家参考借鉴之用。具体实例如下所示: <?php $arr = array('d'=>'sdf', 'r'=>'sdf', 'a'=> 'eee'); //sort($arr); // 对数组的值进行重排, 删除之前的...
在上述例子中,`unset()`成功地删除了数组 `$a` 的第二个元素,但数组的下标并未自动重排。这意味着原来的第三个元素现在变成了第二个元素,而原位置的第二个元素被清除,导致访问原第二个元素的下标($a[1])时输出...
在JavaScript中,数组的随机重排可以通过多种方法实现,本文介绍了两种实现技巧:使用原生的sort方法和通过扩展Array原型来添加shuffle方法。 第一种方法使用了JavaScript数组的sort方法。sort方法可以对数组的元素...
1. 数组实现:删除操作同样可能导致数组重排。如果删除位置在末尾,只需减少长度;否则,需要将后续元素前移覆盖被删除的位置。 ```c void deleteArray(int pos) { if (pos < 0 || pos >= length) { printf(...
1. **获取区位码**:通过 `(chinese[0]-0xa0)` 和 `(chinese[1]-0xa0)` 计算出区码和位码。 2. **定位数据**:利用计算出的区位码来定位到文件中对应的位置。 3. **读取数据**:从计算出的位置开始读取32字节的数据...
这个库的核心理念是引入了类似Pandas DataFrame的标签概念,但扩展到了多维数组,这使得在处理复杂的、多维的科学数据时,能够更加清晰地管理和操作数据。xarray的设计灵感来源于NetCDF文件格式,因此它天然适合处理...
使用 argsort() 函数对数组进行排序,并返回排序后的索引。 4. 随机分布检测: 如何检验一个数据集或者时间序列是随机分布的?画 Lag Plot(相关图),如果图上的点呈散乱分布,则为随机分布。 5. Pandas 的应用:...
- **缺失数字(Missing Number)**: 给定一个包含[0, n]范围内所有数字的数组`nums`,但缺少了一个数字,找到这个缺失的数字。 - **判断2的幂(Power of Two)**: 判断一个给定的正整数是否为2的幂。 - **计算1的位数...