oral_quiz->#KLeastNumbers#

#include <stdio.h>
#include <exception>
#include <vector>
#include <set>

void PrintArrayFromI2J(int* data, int index1, int index2) {
	for(int i=index1; i<=index2; ++i) {
		printf("%d ", data[i]);
	}
	printf("\n");
}

void Swap(int* p1, int* p2) {
	int temp = *p1;
	*p1 = *p2;
	*p2 = temp;
}

int Partition(int* data, int length, int start, int end) {
	if(data == NULL || length <= 0 || start < 0 || end >= length)
		throw std::exception();

	int index = (start + end) >> 1;
	Swap(&data[index], &data[end]);

	int small = start - 1;
	for(index = start; index < end; ++index) {
		if(data[index] < data[end]) {
			++small;
			Swap(&data[small], &data[index]);
		}
	}

	++small;
	Swap(&data[small], &data[end]);

	return small;
}

bool g_bInputInvalid = false;

bool CheckInvalidArray(int* numbers, int length) {
	g_bInputInvalid = false;
	if(numbers == NULL || length <= 0)
		g_bInputInvalid = true;

	return g_bInputInvalid;
}

void MyGetLeastNumbers(int* data, int length, int k) {
	if(CheckInvalidArray(data, length))
		return;

	if(k > length) k = length;

	int start=0, end=length-1;
	int index = Partition(data, length, start, end);
	while(index != k-1) {
		if(index > k-1) {
			end = index - 1;
			index = Partition(data, length, start, end);
		}
		else {
			start = index + 1;
			index = Partition(data, length, start, end);
		}
	}

	PrintArrayFromI2J(data, 0, k-1);
}

// ====================方法1====================
void GetLeastNumbers_Solution1(int* input, int n, int* output, int k)
{
    if(input == NULL || output == NULL || k > n || n <= 0 || k <= 0)
        return;

    int start = 0;
    int end = n - 1;
    int index = Partition(input, n, start, end);
    while(index != k - 1)
    {
        if(index > k - 1)
        {
            end = index - 1;
            index = Partition(input, n, start, end);
        }
        else
        {
            start = index + 1;
            index = Partition(input, n, start, end);
        }
    }

    for(int i = 0; i < k; ++i)
        output[i] = input[i];
}

//====================Solution2======================
typedef std::multiset<int, std::greater<int> > intSet;
typedef std::multiset<int, std::greater<int> >::iterator setIterator;
void GetLeastNumbers_Solution2(const std::vector<int>& data, intSet& leastNumbers, int k) {
	leastNumbers.clear();

	if(k < 1 || data.size() < k)
		return;

	std::vector<int>::const_iterator iter = data.begin();
	for(; iter != data.end(); ++iter) {
		if(leastNumbers.size() < k)
			leastNumbers.insert(*iter);
		else {
			setIterator iterGreatest = leastNumbers.begin();

			if(*iter < *iterGreatest) {
				leastNumbers.erase(iterGreatest);
				leastNumbers.insert(*iter);
			}
		}
	}
}

// ====================测试代码====================
void Test(char* testName, int* data, int n, int* expectedResult, int k)
{
    if(testName != NULL)
        printf("%s begins: \n", testName);

    std::vector<int> vectorData;
    for(int i = 0; i < n; ++ i)
        vectorData.push_back(data[i]);

    if(expectedResult == NULL)
        printf("The input is invalid, we don't expect any result.\n");
    else
    {
        printf("Expected result: \n");
        for(int i = 0; i < k; ++ i)
            printf("%d\t", expectedResult[i]);
        printf("\n");
    }

//    printf("Result for MySolution:\n");
//    MyGetLeastNumbers(data, n, k);

//    printf("Result for solution1:\n");
//    int* output = new int[k];
//    GetLeastNumbers_Solution1(data, n, output, k);
//    if(expectedResult != NULL)
//    {
//        for(int i = 0; i < k; ++ i)
//            printf("%d\t", output[i]);
//        printf("\n");
//    }
//
//    delete[] output;
//
    printf("Result for solution2:\n");
    intSet leastNumbers;
    GetLeastNumbers_Solution2(vectorData, leastNumbers, k);
    printf("The actual output numbers are:\n");
    for(setIterator iter = leastNumbers.begin(); iter != leastNumbers.end(); ++iter)
        printf("%d\t", *iter);
    printf("\n\n");
}

// k小于数组的长度
void Test1()
{
    int data[] = {4, 5, 1, 6, 2, 7, 3, 8};
    int expected[] = {1, 2, 3, 4};
    Test("Test1", data, sizeof(data) / sizeof(int), expected, sizeof(expected) / sizeof(int));
}

// k等于数组的长度
void Test2()
{
    int data[] = {4, 5, 1, 6, 2, 7, 3, 8};
    int expected[] = {1, 2, 3, 4, 5, 6, 7, 8};
    Test("Test2", data, sizeof(data) / sizeof(int), expected, sizeof(expected) / sizeof(int));
}

// k大于数组的长度
void Test3()
{
    int data[] = {4, 5, 1, 6, 2, 7, 3, 8};
    int* expected = NULL;
    Test("Test3", data, sizeof(data) / sizeof(int), expected, 10);
}

// k等于1
void Test4()
{
    int data[] = {4, 5, 1, 6, 2, 7, 3, 8};
    int expected[] = {1};
    Test("Test4", data, sizeof(data) / sizeof(int), expected, sizeof(expected) / sizeof(int));
}

// k等于0
void Test5()
{
    int data[] = {4, 5, 1, 6, 2, 7, 3, 8};
    int* expected = NULL;
    Test("Test5", data, sizeof(data) / sizeof(int), expected, 0);
}

// 数组中有相同的数字
void Test6()
{
    int data[] = {4, 5, 1, 6, 2, 7, 2, 8};
    int expected[] = {1, 2};
    Test("Test6", data, sizeof(data) / sizeof(int), expected, sizeof(expected) / sizeof(int));
}

// 输入空指针
void Test7()
{
    int* expected = NULL;
    Test("Test7", NULL, NULL, expected, 0);
}

int main(int argc, char* argv[])
{
    Test1();
    Test2();
    Test3();
    Test4();
    Test5();
    Test6();
    Test7();

    return 0;
}



转载于:https://my.oschina.net/ITHaozi/blog/281031

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值