您的位置:首页 > 其它

输入n个整数,输出其中最小的k个——来自华为OJ平台测试基础篇

2014-10-01 18:11 731 查看

/*

* 输入n个整数,输出其中最小的k个

* 描述: 输入n个整数,输出其中最小的k个。

* 详细描述:

* 接口说明

* 原型:

* bool GetMinK(unsigned int uiInputNum, int * pInputArray, unsigned int uiK, int * pOutputArray);

* 输入参数:

* unsigned int uiInputNum //输入整数个数

* int * pInputArray //输入整数数组

* unsigned int uiK //需输出uiK个整数

* 输出参数(指针指向的内存区域保证有效):

* int * pOutputArray //最小的uiK个整数

* 返回值:

* false 异常失败

* true 输出成功

* 知识点: 循环,数组

* 题目来源: 内部整理

* 练习阶段: 初级

* 运行时间限制: 10Sec

* 内存限制: 128MByte

* 输入:

* 输入说明

* 1 输入两个整数

* 2 输入一个整数数组

* 输出:

* 输出一个整数数组

* 样例输入: 5 2

* 1 3 5 7 2

* 样例输出: 1 2

* 完成日期:214/10/01

*/

#include <iostream>

#include <string.h>

#include <string>

#include <vector>

using namespace std;

bool Input01(int &n,int &k);

bool Input02(std::string &str);

void Transfrom(std::string str,vector<int> &Inputnum,int &size);

bool GetMinK(unsigned int uiInputNum, int * pInputArray, unsigned int uiK, int * pOutputArray);

bool Isvalid(int n,int k,int size);

void PutintoArray(vector<int> Inputnum,int* pInputArray,int size);

void Getkmin(int* pInputArray,int* pOutputArray,int size,int k);

void Output(int* pOutputArray,int k);

int main()

{

int n,k;

bool isOK = Input01(n,k);

if(!isOK)

{

return -1;

}

if((n<=0) || (k<=0) || (n<k))

{

return -1;

}

int* pInputArray = new int
;

int* pOutputArray = new int[k];

bool result = GetMinK(n,pInputArray,k,pOutputArray);

if(!result)

{

return -1;

}

system("pause");

delete[] pInputArray;

delete[] pOutputArray;

return 0;

}

bool Input01(int &n,int &k)

{

std::string str;

getline(std::cin,str,'\n');

const char* string = str.c_str();

int num =0;

char delm[] = " \t\n";

char* token = strtok(const_cast<char*>(string),delm);

num++;

n = atoi(token);

while(token!=NULL)

{

token = strtok(NULL,delm);

num++;

if(token!=NULL)

{

if(num>2)

{

return false;

}

k = atoi(token);

}

}

return true;

}

bool GetMinK(unsigned int uiInputNum, int * pInputArray, unsigned int uiK, int * pOutputArray)

{

std::string str;

vector<int> Inputnum;

int n = static_cast<int>(uiInputNum);

int k = static_cast<int>(uiK);

int size = 0;

bool flag = Input02(str);

if(!flag)

{

return false;

}

Transfrom(str,Inputnum,size);

if(!Isvalid(n,k,size))

{

return false;

}

PutintoArray(Inputnum,pInputArray,size);

Getkmin(pInputArray,pOutputArray,size,k);

Output(pOutputArray,k);

return true;

}

bool Input02(std::string &str)

{

/*

* 如果前面有一个输入std::cin >> n >> k;以一个回车键结束,故而停留在缓冲区了。

* 当使用getline()这个函数时,读到这个回车符,就认为输入结束了。

*/

// cin.get();

getline(std::cin,str,'\n');

int len = str.size();

char c;

for(int i=0;i<len;i++)

{

c = str.at(i);

if(!((c==32) || (c>=48 && c<=57) || c==9))

{

return false;

}

}

return true;

}

void Transfrom(std::string str,vector<int> &Inputnum,int &size)

{

const char* string = str.c_str();

char delm[] = " \t\n";

int value = 0;

char* token = strtok(const_cast<char*>(string),delm);

value = atoi(token);

Inputnum.push_back(value);

while(token!=NULL)

{

token = strtok(NULL,delm);

if(token!=NULL)

{

value = atoi(token);

Inputnum.push_back(value);

}

}

size = Inputnum.size();

return;

}

bool Isvalid(int n,int k,int size)

{

if(n!=size)

{

return false;

}

return true;

}

void PutintoArray(vector<int> Inputnum,int* pInputArray,int size)

{

for(int i=0;i<size;i++)

{

pInputArray[i] = Inputnum.at(i);

}

return;

}

void Getkmin(int* pInputArray,int* pOutputArray,int size,int k)

{

int temp = 0;

for(int i=0;i<k;i++)

{

for(int j=0;j<size;j++)

{

if(pInputArray[j]<pInputArray[j+1])

{

temp = pInputArray[j+1];

pInputArray[j+1] = pInputArray[j];

pInputArray[j] = temp;

}

}

pOutputArray[i] = pInputArray[size-i-1];

}

return;

}

void Output(int* pOutputArray,int k)

{

for(int i=0;i<k-1;i++)

{

std::cout << pOutputArray[i] << " ";

}

std::cout << pOutputArray[k-1] << endl;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: