一道华为校园招聘软件研发上机测试题及我个人解法

题目: 

给定一个数组input[] ,如果数组长度n为奇数,则将数组中最大的元素放到 output[] 数组最中间的位置,如果数组长度n为偶数,则将数组中最大的元素放到 output[] 数组中间两个位置偏右的那个位置上,然后再按从大到小的顺序,依次在第一个位置的两边,按照一左一右的顺序,依次存放剩下的数。

      例如:input[] = {3, 6, 1, 9, 7}   output[] = {3, 7, 9, 6, 1};             input[] = {3, 6, 1, 9, 7, 8}    output[] = {1, 6, 8, 9, 7, 3}

             函数接口   void sort(int input[[, int n, int output[])

基本的方法:

1)  先进行排序,然后挨个放/也可以以2为间隔存放。

第一种方法的时间复杂度根据所选排序算法的不同而不同,空间复杂度为:n;

2)  第一次选出一个最大,放在相应位置;第二次取出剩余最大值,放相应位置;依次类推。

其中,选最大值可以使用最大堆方法来实现(注意,不是堆排序哦)

选择一种好的排序算法的话(比如快排),两者的时间复杂度是差不多的。

 

以下是我个人的解法(C++程序):

#include<iostream>
using namespace std;
void sort(int input[], int n, int output[])
{
 int temp,i,j;
 for(i=0;i<n;i++)//冒泡排序
  for(int j=0;j<n-i-1;j++)
   if(input[j]>input[j+1])
   {
    temp=input[j];
    input[j]=input[j+1];
    input[j+1]=temp;
   }
 /*
 for(i=0;i<n;i++)//打印排序后的结果,可不打印
  cout<<input[i]<<" ";
 cout<<endl;
 */
 if(n%2==0)//n为偶数
 {
  output[n/2]=input[n-1];
  output[0]=input[0];
  for(i=n/2-1,j=n-2;i>0&&j>0;i--,j=j-2)
   output[i]=input[j];
  for(i=n/2+1,j=n-3;i<n && j>0;i++,j=j-2)
   output[i]=input[j];
 }
 else//n为奇数
 {
  output[n/2]=input[n-1];
  //output[0]=input[0];
  for(i=n/2-1,j=n-2;i>=0&&j>0;i--,j=j-2)
   output[i]=input[j];
  for(i=n/2+1,j=n-3;i<n && j>=0;i++,j=j-2)
   output[i]=input[j];
 }
 cout<<"output is:"<<endl;
 for(i=0;i<n;i++)
  cout<<output[i]<<" ";
}
 
void main()
{
 int n,i;
 cout<<"input number n:";
 cin>>n;
 int * input=new int[n];
 int *output=new int[n];
 for(i=0;i<n;i++)
  cin>>input[i];
 
 sort(input,n,output);
 cout<<endl;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值