C++笔试题


    今天又面试了两家公司,现在把笔试的几个题目总结一下,一来是自我总结和学习,二来是将笔试的题目与大家分享一下,说不定下一个你就遇到了同样的问题。

两道机试题:

    1.完成下面的函数,将一个八进制的数(字符串表示)转化成十进制的数,如“100”返回的结果是64要求不使用库函数。(北京轩宇信息技术)

int convert(char *str);

 

int convert(char *str);

int convert(char *str)
{
	//计算字符串的长度
	int size = 0;
	while(*str != '\0')
	{
		size ++;
		str ++;
	}
	//计算这八进制的值,从低位往高位加
	int lastIndex = 0;	//字符从后信前的位数
	int sum = 0, temp = 0;			//当前位数的值
	str --;				//上面的循环已经将str指向'\0',向前移一位
	while (lastIndex < size)
	{
		temp = *str - '0';
		temp = temp << 3*lastIndex;	//左移3*i位转换成10进制的值,2^3 = 8
		sum += temp;
		lastIndex ++;
		str --;
	}
	return sum;
}

一开始,没看到不能使用库函数。如果能使用库函数这会变得更简单,我的想法是:

int convert2(char *str)
{
	int n = strlen(str);
	int temp = 0;
	int sum = 0;
	for (int i =0; i<n; i++)
	{
		temp = str[n-i-1] - '0';
		sum += (int)(temp*pow(8.0, i));
	}
	return sum;
}


 

    2.有一个字符串的形式如:a[]b[]c[]d,其中abcd0-9中的数字,[]+ - * /中的任意一个运算符。完成以下函数求表达式的值,不考虑括号、浮点数。如1-6/4*5,结果为-4(北京轩宇信息技术)

 

这一题做了半天做不来,我想到是应该递归可以解决,因为总是从左到右找优先级较高的运算符,最终的跳出条件是只剩下两个运算符,但不知道怎么写!就知道这个面试肯定是没希望了(因为他考的主要就是这道题,试卷上写着建议先做第二题)

这题对我还挺有挑战的,有知道解法的大夹求解!

 


    下午去了另一家公司,有两题笔试题记忆犹新:

    3.写一个函数,求出1+2+3+...+n的和。

这是不非常简单?学程序刚入门的都写出来,也许一看到你就会写出下面这样一段程序:

int accumulation(int n)
{
	if (n < 1)
	{
		return -1;
	}else
	{
		int sum = 0;
		for (int i=1; i<=n; i++)
		{
			sum += i;
		}
		return sum;
	}
}

我看到这题目,一开始和大家的想法是一样的,后面一想,这不是一个等差数列吗?要用n次循环不是效率太低了吗?于是直接用一个等差数列求和公式就计算了,后面HR跟我说我做的是对的,这考的就是一种思维啊,虽然很简单,但你的思维是不是固定了?

int accumulation2(int n)
{
	if (n < 1)
	{
		return -1;
	}else
	{
		return n*(1+n)/2;
	}
}


    4.有一组数据,记录了一个城市每天的最高气温,请找出最近一次连续5天盖过最高气温的时间,返回对应的下标,盖过指前面连续5天都比这一天气温低。如下表中返回的是下标10

气温

32

 34

35

31

28

25

22

18

21

24

27

24

23

下标

0

1

2

3

4

5

6

7

8

9

10

11

12

我的思路就是从前往后找,标记最后一个值为最大值,如果前面5个都小于该值,返回下标;如果不到5个发现更大的值,则重新标记最大值的位置。后来HR说我这思路也是对的,看来这次笔试还不错!

代码如下:

int getHighTemperature(vector<float> tempers)
{
	vector<float>::size_type size = tempers.size();
	vector<float>::size_type idx = size -1, maxIdx = size-1, count = 0;
	while(idx >= 0)
	{
		if (count == 5)
		{
			break;
		}
		if (tempers[idx] > tempers[maxIdx] && count < 5)
		{
			maxIdx = idx;
			count = 0;
			idx --;
		} else
		{
			count ++;
			idx --;
		}
	}
	return count >= 5 ? maxIdx : -1;
}


 

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付 39.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值