今天又面试了两家公司,现在把笔试的几个题目总结一下,一来是自我总结和学习,二来是将笔试的题目与大家分享一下,说不定下一个你就遇到了同样的问题。
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,其中a、b、c、d为0-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; }