标签:
昨天面试了2家公司,加上上个月28号面试的题目,有几道题目没有做对,在这里总结一下,
避免下次犯同样的错误。
首先是综合题:
1. -1,2,7,28, ,126
解:63
它们的规律是:
0的三次方减1=-1
1的三次方加1=2
2的三次方减1=7
3的三次方加1=28
4的三次方减1=63
5的三次方加1=126
……
n^3+(-1)^n
2. 2,2,3,6,15
解:45
它们的规律是:
2*2/2 2
3*3/2 3
4*3/2 6
5*6/2 15
6*15/2 45
3. 160个人整齐地排成一列,依顺序编号为1、2、3、······159,160.第一次挑选出所有奇数
位置上的人,第二次再从剩余人中挑选出所有奇数位置上的人员,依次类推,请问最后剩下的一个人的
编号是
解:128
160/2=80 80/2=40 40/2=20 20/2=10 10/2=5 5/2=2 2/2=1 共需要选择7次
第1次选出奇数 还有 2 4 6 8... 2的1次方
第2次剔除2 还有4 8... 2的2次方
...
第7次 2的次方=128
3.有一片匀速生长的草场,可供27头牛吃6天,23头牛吃9天,可供21头牛吃几天?
解:重点考虑“匀速生长”的因素
草场每周天生长(9*23-6*27)/(9-6)=15
则原有草27*6-6*15=72
设可供21头牛吃X天
则72+15X=21X
故X=12天
专业题
1.++i i++那个更高效,为什么?
解:++i的效率高些,++i在运算过程中不产生临时对象,返回的就是i,是个左值,类似++i=1这样的
表达式是合法的,而i++在运算的过程中会产生临时对象,返回的是零时对象的值,是个右值,像i+
+=1这样的表达式是非法的
对于内置类型,单独的i++和++i语句,现在的编译器基本上都会优化成++i,所以就没什么区别了
2.指针和引用的区别?
解:1.指针和引用的定义和性质区别:
(1)指针:指针是一个变量,只不过这个变量存储的是一个地址,指向内存的一个存储单元;而引用
跟原来的变量实质上是同一个东西,只不过是原变量的一个别名而已。如:
int a=1;int *p=&a;
int a=1;int &b=a;
上面定义了一个整形变量和一个指针变量p,该指针变量指向a的存储单元,即p的值是a存储单元的
地址。
而下面2句定义了一个整形变量a和这个整形a的引用b,事实上a和b是同一个东西,在内存占有同一
个存储单元。
(2)可以有const指针,但是没有const引用;
(3)指针可以有多级,但是引用只能是一级(int **p;合法 而 int &&a是不合法的)
(4)指针的值可以为空,但是引用的值不能为NULL,并且引用在定义的时候必须初始化;
(5)指针的值在初始化后可以改变,即指向其它的存储单元,而引用在进行初始化后就不会再改变了
。
(6)"sizeof引用"得到的是所指向的变量(对象)的大小,而"sizeof指针"得到的是指针本身的大小;
(7)指针和引用的自增(++)运算意义不一样;
2.指针和引用作为函数参数进行传递时的区别。
(1)指针作为参数进行传递:
用指针传递参数,可以实现对实参进行改变的目的,是因为传递过来的是实参的地址,因此使用*a
实际上是取存储实参的内存单元里的数据,即是对实参进行改变,因此可以达到目的。
(2)将引用作为函数的参数进行传递。
在讲引用作为函数参数进行传递时,实质上传递的是实参本身,即传递进来的不是实参的一个拷贝
,因此对形参的修改其实是对实参的修改,所以在用引用进行参数传递时,不仅节约时间,而且可
以节约空间。
引用进行参数传递时,事实上传递的是实参本身,而不是拷贝。所以在上述要达到同时修改指针的
目的的话,就得使用引用了。
[参考地址]http://www.cnblogs.com/dolphin0520/archive/2011/04/03/2004869.html
3.打印一个二叉树
//二叉树的 创建 输出
#include <stdio.h>
#include <malloc.h>
typedef int DataType;
typedef struct Node {
DataType data;
struct Node *LChild;
struct Node *RChild;
}BitNode, *BitTree;
/*先序创建二叉树*/
void CreatBiTree(BitTree *bt) {
char ch;
ch = getchar();
if (ch == ‘.‘) *bt = NULL;
else { *bt = (BitTree)malloc(sizeof(BitNode));
(*bt)->data = ch;
CreatBiTree(&((*bt)->LChild));
CreatBiTree(&((*bt)->RChild)); }
}
void Visit(char ch) {
printf("%c ", ch);
}
/*先序遍历二叉树*/
void PreOrder(BitTree root) {
if (root != NULL) {
Visit(root->data);
PreOrder(root->LChild);
PreOrder(root->RChild);
}
}
/*中序遍历二叉树*/
void InOrder(BitTree root)
{
if (root != NULL) {
InOrder(root->LChild);
Visit(root->data);
InOrder(root->RChild);
}
}
/* 后序遍历二叉树*/
void PostOrder(BitTree root)
{
if (root != NULL) {
PostOrder(root->LChild);
PostOrder(root->RChild);
Visit(root->data);
}
}
//后序遍历求二叉树的高度递归算法//
int PostTreeDepth(BitTree bt)
{
int hl, hr, max; if (bt != NULL) {
hl = PostTreeDepth(bt->LChild);
//求左子树的深度
hr = PostTreeDepth(bt->RChild);
//求右子树的深度
max = hl > hr ? hl : hr;
//得到左、右子树深度较大者
return(max + 1);
//返回树的深度
}
else
return(0);
//如果是空树,则返回0
}
void main()
{
BitTree T; int h;
int layer; int treeleaf; layer = 0;
printf("请输入二叉树中的元素(以扩展先序遍历序列输入,其中.代表空子树):\n"); CreatBiTree(&T);
printf("先序遍历序列为:"); PreOrder(T);
printf("\n中序遍历序列为:"); InOrder(T);
printf("\n后序遍历序列为:");
}
[参考地址]http://wenku.baidu.com/link?url=QssTB4uNsFWifuB0OvyfyryHBo-cQys4hkFn5MEnuEVWZQwQzv-zX1_SSug9W9m3wz3ipHnc7F4C0hQUayBOiSGqF1ujTTdKCXNJ46iDaui
[参考地址]http://blog.csdn.net/luckyxiaoqiang/article/details/7518888
面试时做过的几个C/C++笔试题
标签:
原文地址:http://www.cnblogs.com/freemindblog/p/4601277.html