首页 > 试题广场 >

奇数下标都是奇数或者偶数下标都是偶数

[编程题]奇数下标都是奇数或者偶数下标都是偶数
  • 热度指数:1973 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个长度不小于2的数组arr,实现一个函数调整arr,要么让所有的偶数下标都是偶数,要么让所有的奇数下标都是奇数
注意:1、数组下标从0开始!
2、本题有special judge,你可以输出任意一组合法解!同时可以证明解一定存在
[要求]
时间复杂度为,额外空间复杂度为


输入描述:
第一行一个整数N。表示数组长度
接下来一行N个整数表示数组内的数


输出描述:
输出N个整数。表示调整后的数组
示例1

输入

5
1 2 3 4 5 

输出

2 1 4 3 5

说明

样例中的输出保证了奇数下标都是奇数

备注:

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int n = Integer.parseInt(sc.nextLine().trim());
            String[] s = sc.nextLine().trim().split(" ");
            int[] arr=new int[n];
            for (int i = 0; i < n; i++) {
                arr[i]=Integer.parseInt(s[i]);
            }
            new Solution().adjustArray(arr);
            for (int i = 0; i < n; i++) {
                if(i==n-1) System.out.println(arr[i]);
                else System.out.print(arr[i]+" ");
            }
        }
    }
}

class Solution {
    public void adjustArray(int[] arr){
        int count=0;
        for (int i = 0; i < arr.length; i++) {
            if(arr[i]%2!=0) count++;
        }
        if(count>arr.length/2) adjustArray0(arr);
        else{
            int i=0;
            int j=0;
            while(i<arr.length&&j<arr.length){
                while (i<arr.length&&arr[i]%2!=0||i%2==0) i++;   //找到下标为奇数的偶数
                while (j<arr.length&&arr[j]%2==0||j%2!=0) j++;   //找到不符合条件的奇数
                if(i<arr.length&&j<arr.length){
                    arr[i]^=arr[j];
                    arr[j]^=arr[i];
                    arr[i]^=arr[j];
                    i++;
                    j++;
                }
            }
        }
    }

    public void adjustArray0(int[] arr){
        int i=0;
        int j=0;
        while(i<arr.length&&j<arr.length){
            while (i<arr.length&&arr[i]%2==0||i%2!=0) i++;   //找到下标为偶数的奇数
            while (j<arr.length&&arr[j]%2!=0||j%2==0) j++;   //找到不符合条件的偶数
            if(i<arr.length&&j<arr.length){
                arr[i]^=arr[j];
                arr[j]^=arr[i];
                arr[i]^=arr[j];
                i++;
                j++;
            }
        }
    }
}

发表于 2022-04-27 15:24:13 回复(0)
import java.util.*;

public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		
		int n = scanner.nextInt();
        int[] arr = new int[n];
        for(int i=0;i<n;i++){
            arr[i] = scanner.nextInt();
        }
        
        int even = 0;
        int odd = 1;
        while(true){
            while(even < n){
                if(arr[even] % 2 == 0){
                    even += 2;
                }else{
                    break;
                }
            }
            while(odd < n){
                if(arr[odd] % 2 == 1){
                    odd += 2;
                }else{
                    break;
                }
            }
            if(even >= n || odd >= n) break;
            swap(arr,even,odd);
            
        }
        
       for(int i=0;i<n;i++){
            System.out.print(arr[i] + " ");
        }
		
	}
    
    public static void swap(int[] arr,int even,int odd){
        int temp = arr[even];
        arr[even] = arr[odd];
        arr[odd] = temp;
    }
}


发表于 2019-10-23 18:10:23 回复(0)