输入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;
}
/*
* 输入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;
}
相关文章推荐
- 华为OJ平台试题 —— 数组:输入n个整数,输出其中最小的k个
- 华为OJ基础篇-输入n个整数,输出其中最小的k个
- 华为oj初级 输入n个整数,输出其中最小的k个
- 华为OJ——输入n个整数,输出其中最小的k个
- 【华为OJ】【040-输入n个整数,输出其中最小的k个】
- 华为oj: 输入n个整数,输出其中最小的k个
- 华为OJ——输入n个整数,输出其中最小的k个
- 华为OJ试题:输入n个整数,输出其中最小的k个
- [华为OJ--C++]040-输入n个整数,输出其中最小的k个
- 华为OJ 初级:输入n个整数,输出其中最小的k个
- 华为OJ——输入n个整数,输出其中最小的k个
- 【华为OJ】输入n个整数,输出其中最小的k个
- 华为OJ题目(二十一):输入n个整数,输出其中最小的k个
- 【华为OJ】输入n个整数,输出其中最小的k个
- 华为OJ——输入n个整数,输出其中最小的k个
- 华为oj 输入n个整数,输出其中最小的k个
- 【华为机试】输入n个整数,输出其中最小的k个
- 华为机试---输入n个整数,输出其中最小的k个
- [华为]输入n个整数,输出其中最小的k个
- 华为训练题:输入n个整数,输出其中最小的k个