2016年秋季中兴校招笔试题

我报的是C++软件开发岗
有20个单选题,题目涉及软件开发设计,全是凭直觉选的,题目都是与软件的设计方案啥的有关
然后是两道编程题

一个是打印*号问题
输入一个数,在标准输出里打印一系列字符串,例如输入4
打印

1
2*3
4*5*6
7*8*9*10
7*8*9*10
4*5*6
2*3
1
void printNums(int num)
{
	if (num < 0 || num > 100)
		return;
	int count = 0;
	std::vector<std::string> res;
	for (size_t i = 0; i < num; ++i)
	{
		std::string temp;
		for (size_t j = 0; j <= i; ++j)
		{
			++count;
			if (j == 0)
				temp = std::to_string(count);
			else
				temp += "*" +  std::to_string(count);
		}
		res.push_back(temp);
		temp = "";
	}
	for (auto& number : res)
		std::cout << number << std::endl;
	//for (size_t i = res.size() - 1; i >= 0; --i)
	std::vector<std::string>::reverse_iterator rit = res.rbegin();
	for (; rit != res.rend();++rit)
		std::cout << *rit << std::endl;
}

一个是FIFO的页数问题,统计未选中的总数,例如输入一个数组{1,2,3,1,2,1},FIFO缓冲大小为2,打印5
分析:
缓冲依次为

1 *
1,2 *
2,3 *
3,1 *
1,2 *
1.2

标星表明在缓冲中没找到对应的数,因为缓冲大小为2,所以最多容纳2个数,来一个数先查找是否在缓冲里,如果在,则表明选中,不在就放入缓冲,同时需要保证缓冲大小为2,弹出最先进队列的数
参考代码,没考虑复杂度

bool findNum(std::deque<int>& deq, int k)
{
	bool res(false);
	for (auto& num : deq)
		if (num == k)
			res = true;
	return res;
}
int countFIFO(size_t max_cache_size, std::vector<int>& nums)
{
	if (nums.size() <= 0 || max_cache_size <= 0) return 0;
	std::deque<int> deq;
	int count(0);
	for (auto& num : nums)
	{
		if (!findNum(deq, num)) { ++count; deq.push_back(num); }
		if (deq.size() > max_cache_size)
		{
			deq.pop_front();
			deq.push_back(num);
		}
	}
	return count;
}