长度为n的数组乱序存放着0至n-1. 现在只能进行0与其他数的交换.将数组中的元素按对应位置放置使得a[i]=i
2017-07-22 15:33
633 查看
原文链接:http://blog.csdn.net/u014659656/article/details/45115573
Question:长度为n的数组乱序存放着0至n-1. 现在只能进行0与其他数的交换.将数组中的元素按对应位置放置使得a[i]=i;
此题目中的数据很像一个哈希表,但是只能用和0交换的方式进行位置调整。目前只知道算法复杂度为o(n^2)空间复杂度为o(1)的方法。
思路:
从最大的元素值n-1开始,一次将元素放到正确的位置。由于只能和0交换,所以一次操作需要两次对换。1.将第i个元素中的值和0交换,使得a[i]=0;2.将当前最大值curMax(即i)和0交换,从而使得a[i]=curMax=i;3.i--,重复1和2,直到所有的元素对号入座
[java] view
plain copy
package Algorithms;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
public class Solution {
public static void main(String args[]){
int n= 8;
int[] arr = new int
;
produce(arr,n);
System.out.println("排序之前: ");
print(arr);
System.out.println("----------------------------------");
sort(arr);
System.out.println("----------------------------------");
System.out.println("排序之后: ");
print(arr);
}
public static void print(int[] arr){
for(int i=0;i<arr.length;i++){
System.out.print(" " + arr[i] + " ");
}
System.out.println();
for(int i=0;i<arr.length;i++){
System.out.print("[" + i + "]" + " ");
}
System.out.println();
System.out.println();
}
public static void produce(int[] rawArray, int n){
Random r = new Random();
int rn,count=0;
Set<Integer> arr = new HashSet<Integer>();
for(;count<n;){ //这里应该是count<n而不是count<=n;如果用小于等于,那么就是死循环,因为当产生n个不重复的数后,所有的数都有了,就会一直continue
rn = r.nextInt(n);
if(arr.contains(rn)){
continue;
}
arr.add(rn);
count ++;
rawArray[count-1] = rn;
//System.out.print(rn + " ");
}
//System.out.println();
}
/**
* 调用方法swap_with_zero来对array进行排序
*/
public static void sort(int[] array) {
int len = array.length;
if(len <= 1){
return;
}
for(int i = len - 1; i > 0; --i){ //从最后一位开始,将最大的数放到最大位置上,然后依次找次大的放
if(array[i] == i) continue; //已经相等,则不交换,避免不必要的重复交换
swap_with_zero(array, array[i]); //现将0和最后一位交换,以便将第n最大值换到第n大位置上
print(array);
int curMax = array[i];
for(int j = i; j >= 0; --j){ //找出第n大的数
if(array[j] > curMax){
curMax = array[j];
}
}
swap_with_zero(array, curMax); //将第n大的数和0互换,从而放到第n大的位置上
print(array);
}
}
public static void swap_with_zero(int[] array, int number){
int len = array.length;
int zIndex = -1;
int nIndex = -1;
for(int i = 0; i < len; ++i){
if(array[i] == 0){
zIndex = i;
}
if(array[i] == number){
nIndex = i;
}
}
int temp = array[zIndex];
array[zIndex] = array[nIndex];
array[nIndex] = temp;
}
}
Question:长度为n的数组乱序存放着0至n-1. 现在只能进行0与其他数的交换.将数组中的元素按对应位置放置使得a[i]=i;
此题目中的数据很像一个哈希表,但是只能用和0交换的方式进行位置调整。目前只知道算法复杂度为o(n^2)空间复杂度为o(1)的方法。
思路:
从最大的元素值n-1开始,一次将元素放到正确的位置。由于只能和0交换,所以一次操作需要两次对换。1.将第i个元素中的值和0交换,使得a[i]=0;2.将当前最大值curMax(即i)和0交换,从而使得a[i]=curMax=i;3.i--,重复1和2,直到所有的元素对号入座
[java] view
plain copy
package Algorithms;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
public class Solution {
public static void main(String args[]){
int n= 8;
int[] arr = new int
;
produce(arr,n);
System.out.println("排序之前: ");
print(arr);
System.out.println("----------------------------------");
sort(arr);
System.out.println("----------------------------------");
System.out.println("排序之后: ");
print(arr);
}
public static void print(int[] arr){
for(int i=0;i<arr.length;i++){
System.out.print(" " + arr[i] + " ");
}
System.out.println();
for(int i=0;i<arr.length;i++){
System.out.print("[" + i + "]" + " ");
}
System.out.println();
System.out.println();
}
public static void produce(int[] rawArray, int n){
Random r = new Random();
int rn,count=0;
Set<Integer> arr = new HashSet<Integer>();
for(;count<n;){ //这里应该是count<n而不是count<=n;如果用小于等于,那么就是死循环,因为当产生n个不重复的数后,所有的数都有了,就会一直continue
rn = r.nextInt(n);
if(arr.contains(rn)){
continue;
}
arr.add(rn);
count ++;
rawArray[count-1] = rn;
//System.out.print(rn + " ");
}
//System.out.println();
}
/**
* 调用方法swap_with_zero来对array进行排序
*/
public static void sort(int[] array) {
int len = array.length;
if(len <= 1){
return;
}
for(int i = len - 1; i > 0; --i){ //从最后一位开始,将最大的数放到最大位置上,然后依次找次大的放
if(array[i] == i) continue; //已经相等,则不交换,避免不必要的重复交换
swap_with_zero(array, array[i]); //现将0和最后一位交换,以便将第n最大值换到第n大位置上
print(array);
int curMax = array[i];
for(int j = i; j >= 0; --j){ //找出第n大的数
if(array[j] > curMax){
curMax = array[j];
}
}
swap_with_zero(array, curMax); //将第n大的数和0互换,从而放到第n大的位置上
print(array);
}
}
public static void swap_with_zero(int[] array, int number){
int len = array.length;
int zIndex = -1;
int nIndex = -1;
for(int i = 0; i < len; ++i){
if(array[i] == 0){
zIndex = i;
}
if(array[i] == number){
nIndex = i;
}
}
int temp = array[zIndex];
array[zIndex] = array[nIndex];
array[nIndex] = temp;
}
}
相关文章推荐
- 长度为n的数组乱序存放着0至n-1. 现在只能进行0与其他数的交换.将数组中的元素按对应位置放置使得a[i]=i
- 长度为N的数组乱序存放着0带N-1.现在只能进行0与其他数的swap操作,请设计并实现排序,必须通过交换实现排序。
- 长度为N的数组乱序存放着0带N-1.现在只能进行0与其他数的swap操作,请设计并实现排序,必须通过交换实现排序。
- 长度为n的数组乱序存放着0至n-1. 现在只能进行0与其他数的swap 请设计并实现排序
- 长度为n的数组乱序存放着0至n-1. 现在只能进行0与其他数的swap,请设计并实现排序。
- google校招笔试题 2.2 长度为n的数组乱序存放着0至n-1. 现在只能进行0与其他数的swap,请设计并实现排序。
- 在一个长度为10的整形数组中,已经放置好了任意10个整数。要求用户任意输入 一个整数,判断该数字是否在数组中。如果在,删除数组中该元素,并把后面的 元素往前挪。(让空出的位置在最后)
- 在一个长度为10的整形数组中,前9个元素是{12,23,34,45,56,67,78,89,90}。 现在要求输入一个整数,把它放到数组中正确的位置当中。(不能删除已有元素)
- (***)有两个10个元素的数组,分别为A和B,编程实现相同位置的元素, 如果 B 的元素小于 A 的元素进行数值交换:(使用回调函数实现)
- 有两个10个元素的数组,分别为A和B,编程实现相同位置的元素, 如果 B 的元素小于 A 的元素进行数值交换:(使用回调函数实现)
- 第一次发博客,新手初试啊,题目如下:有两个10个元素的数组,分别为A和B,编程实现相同位置的元素, 如果 B 的元素小于 A 的元素进行数值交换:(使用回调函数实现)
- 2016魅族校招的一道笔试题,将一个长度为n的数组中存放的是未排序的0到n-1,要求只能将0和其他数swap,完成数组排序
- 【大家来一起讨论吧】百度面试题,假设一整型数组存在若干正数和负数,现在通过某种算法使得该数组的所有负数在正数的左边,且保证负数件和正数间元素相对位置不变。时空复杂度要求:o(n),o(1)
- 第十六讲项目1.4—创建长度16的整型数组a并初始化前15个元素,输入一个整数b,将b插入到a[0]位置
- 调整数组使得奇数元素位于偶数元素之前(相对位置不变)
- 交换两数组中的元素使得二者和差最小
- Combination Sum II 无序数组中找组合(每个元素只能用一次)使得和为target@LeetCode@LeetCode
- C语言 选择排序算法原理和实现 从数组中 找出最小的元素然后交换位置
- 32.(数组、规划)2个数组交换对应元素使二者差最小
- 交换两数组中的元素使得这两个数组的差最小