一个C++面试题的数组和STL解法

在CSDN上看一个题目:是要把输入的各个数字从中间开始一左一右的排列出来。如果输入的数字有奇数个就正中间还开始,如果输入的数字有偶数个,就从中间偏左的一个数字开始。举例:如果输入为1, 2, 4,5,3   输出应该是4,2,1,3,5; 如果输入为1,3,2,5,6,4  输出应该是 5, 3, 1, 2, 4, 6.

 

对于这个题目,可以使用数组,当然如果可以用STL的话,也可以有list来做。

先看一下使用数组的解法:

 

// Try so solve a quiz for fresh graduate test from Huawei 2011

#include <iostream>
#include <iomanip>

using std::cin;
using std::endl;
using std::cout;

template <class T> int getArrayLen( T & array)  
	//使用模板定义一个函数getArrayLen,来返回数组Array的长度
{
	return (sizeof(array) / sizeof(array[0]));
}

int QuizFunction( int inputQ[ ], int k);

int main()
{
	const int MAX(10000);
	int input[ MAX ];

	int n = 0;
	cout << endl << "Please input an integer less than 1001: ";
	cin >> n;
	for (int i = 0; i < n; i++)
		input[i] = i;
	cout << endl << "n is: "<< n << endl;
	int m = getArrayLen(input);
	cout << "Array size is: " << m << endl;
	QuizFunction( input, n );
	return 0;
	}
int QuizFunction( int inputQ[], int k)
{
	int temp(0);
	int outputQ[10000];
#pragma region Sort the input array
	for ( int i = 1; i < k; i++)
	{
		if (inputQ[i-1] > inputQ[i])
		{
			temp = inputQ[i];
			inputQ[i] = inputQ[i-1];
			inputQ[i-1]= temp;
		}
	}
	#pragma endregion
#pragma region Print the Input array
	cout << "The Input is: " << endl;
	for ( int i = 0; i < k; i++)
		cout << inputQ[i] << " ";
#pragma endregion
#pragma region Put the elements in the desired order into the Result Array
	for (int i = 0; i < k; i++)
	{
		if ( k % 2 == 0)
		{
			if ( i % 2 ==0) 
				outputQ[ k/2 -1 - ( i + i % 2) / 2] = inputQ[i];
			else
				outputQ[ k/2 -1  + ( i + i % 2) / 2] = inputQ[i];
		}

		else 
		{
			if ( i % 2 ==0) 
				outputQ[ (k-1)/2 - ( i  + i % 2) / 2] = inputQ[i];
			else
				outputQ[ (k-1)/2 + ( i + i % 2) / 2] = inputQ[i];
		}
	}
#pragma endregion
#pragma region Print the output array
	cout << endl << "The Output is: " << endl;
	for (int i = 0; i < k; i++)
		cout << outputQ[i] << " ";
	cout << endl;
	return 0;
#pragma endregion
}

再来看STL的做法:

 

// Ex10_05_Quiz.cpp
// Working with a list to solve a quiz from Huawei for 2012 fresh graduates
#include <iostream>
#include <list>
#include <string>

using std::cin;
using std::cout;
using std::endl;
using std::list;
using std::string;

int main()
{
	list<int> integerListInput;	//Put the initial inputs here
	list<int> integerListResult;	// Put the result here
	list <int>::iterator iter;		// Stores an iterator in the input / output list

	int i = 0;
	
#pragma region  Read the data from cmd
	cout << "Enter a  number less than 10001.  Just press Enter to end:"
		<< endl;
	int number =0;
	cin >> number;
#pragma endregion
#pragma region insert data 0 to i-1 into the input list
	for (int i = 0 ; i < number; i ++)
	{
		iter = integerListInput.begin();
		integerListInput.insert(iter,i);
	}
#pragma endregion

#pragma region Output the data using an iterator
	cout << endl << "Here is the numbers you entered:" << endl;
	for ( iter = integerListInput.begin(); iter != integerListInput.end(); iter ++ )
		cout << *iter << " ";
#pragma endregion

#pragma region Sort the data in ascending order
	cout << endl << "In ascending sequence the sentences you entered are:" << endl;
	integerListInput.sort();
	for ( iter = integerListInput.begin(); iter != integerListInput.end(); iter++)
		cout << *iter << " ";
#pragma endregion

#pragma region insert the sorted data according to odd/even cursor of the item
	for( iter = integerListInput.begin(); iter != integerListInput.end(); iter++)
		{
			i++;
			if( i % 2==0) 
				integerListResult.push_front(*iter);
			else
				integerListResult.push_back(*iter);
		}
#pragma endregion

	// Clear i value
	i = 0;
	
	//Output the result List
	cout << endl << "The result list is: " << endl;
	for( iter = integerListResult.begin(); iter != integerListResult.end(); iter++) 
		cout << *iter << " ";

	return 0;
}

 

以上在VS2010 下调试通过。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值