`
MouseLearnJava
  • 浏览: 467257 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

重排数组使得array[i]等于array[array[i]],但只能用0(1)的额外空间

阅读更多
题目:给定一个长度为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]
0
0
分享到:
评论

相关推荐

    第5章 matlab数组和数组运算(2).docx

    如果想要生成与已有数组相同维数的全1或全0数组,可以使用`ones(size(array))`或`zeros(size(array))`。 2. 单位矩阵:使用`eye`函数生成,其功能类似于`ones`和`zeros`,但生成的是对角线上元素为1,其余位置为0的...

    PHP中unset,array_splice删除数组中元素的区别

    使用array_splice()函数删除元素后,数组中被删除元素的位置会被后面元素填补,而且数组会重新索引,使得剩余元素的索引连续。继续以同样的数组为例,如果使用array_splice($arr, 1, 1);来删除索引为1的元素,结果会...

    PHP函数shuffle()取数组若干个随机元素的方法分析_.docx

    - `$array`:需要被随机重排的数组。 - **返回值**: - 成功执行返回 `true`,失败则返回 `false`。 - **注意**: - `shuffle()` 会改变原始数组的键名,如果数组是关联数组,原有的键名将会丢失。 - 如果需要...

    PHP使用array_merge重新排列数组下标的方法

    然而,要注意的是,如果需要保持原有数组的键值而不进行重置,可以使用其他方法,如 `+` 运算符或 `array_replace()` 函数,这些方法在处理关联数组时通常能更好地保留原始键。 总之,`array_merge()` 是PHP中一个...

    javascript数组快速打乱重排的方法

    这个算法是一种在线算法,即在原数组上进行操作,无需额外空间,且保证了每次打乱都是均匀分布的。以下是使用Fisher-Yates算法打乱数组的示例: ```javascript function shuffleArray(arr) { for (let i = arr....

    php对二维数组按指定键值key排序示例代码

    复制代码 代码如下: function array_sort($array, $key){ if(is_array($array)){ ...for( $i = 0; $i &lt; count xss=removed xss=removed xss=removed&gt; $v){ $new_array[$j] = $array[$v]; $j++; } uns

    Numpy and Pandas Cheat Sheet.zip

    10. **数组选择和布尔索引Boolean Indexing**: 可以使用布尔数组选择特定元素,如`array[array &gt; 0]`。 **Pandas** 1. **DataFrame对象DataFrame**: DataFrame是一个二维表格型数据结构,具有列名和行索引,可以...

    PHP数组排序之sort、asort与ksort用法实例

    本文实例讲解了PHP数组排序中sort、asort与ksort的用法,供大家参考借鉴之用。具体实例如下所示: &lt;?php $arr = array('d'=&gt;'sdf', 'r'=&gt;'sdf', 'a'=&gt; 'eee'); //sort($arr); // 对数组的值进行重排, 删除之前的...

    php删除数组元素示例分享

    在上述例子中,`unset()`成功地删除了数组 `$a` 的第二个元素,但数组的下标并未自动重排。这意味着原来的第三个元素现在变成了第二个元素,而原位置的第二个元素被清除,导致访问原第二个元素的下标($a[1])时输出...

    JavaScript对数组进行随机重排的方法

    在JavaScript中,数组的随机重排可以通过多种方法实现,本文介绍了两种实现技巧:使用原生的sort方法和通过扩展Array原型来添加shuffle方法。 第一种方法使用了JavaScript数组的sort方法。sort方法可以对数组的元素...

    (C语言彼)数据结构线性表的各种操作

    1. 数组实现:删除操作同样可能导致数组重排。如果删除位置在末尾,只需减少长度;否则,需要将后续元素前移覆盖被删除的位置。 ```c void deleteArray(int pos) { if (pos &lt; 0 || pos &gt;= length) { printf(...

    从HZK16中读取汉字的c语言源代码

    1. **获取区位码**:通过 `(chinese[0]-0xa0)` 和 `(chinese[1]-0xa0)` 计算出区码和位码。 2. **定位数据**:利用计算出的区位码来定位到文件中对应的位置。 3. **读取数据**:从计算出的位置开始读取32字节的数据...

    xarray:Python中带有ND标签的数组和数据集

    这个库的核心理念是引入了类似Pandas DataFrame的标签概念,但扩展到了多维数组,这使得在处理复杂的、多维的科学数据时,能够更加清晰地管理和操作数据。xarray的设计灵感来源于NetCDF文件格式,因此它天然适合处理...

    数据分析面试题-python笔面试题汇总.docx

    使用 argsort() 函数对数组进行排序,并返回排序后的索引。 4. 随机分布检测: 如何检验一个数据集或者时间序列是随机分布的?画 Lag Plot(相关图),如果图上的点呈散乱分布,则为随机分布。 5. Pandas 的应用:...

    LeetCode练习答案

    - **缺失数字(Missing Number)**: 给定一个包含[0, n]范围内所有数字的数组`nums`,但缺少了一个数字,找到这个缺失的数字。 - **判断2的幂(Power of Two)**: 判断一个给定的正整数是否为2的幂。 - **计算1的位数...

Global site tag (gtag.js) - Google Analytics