笔试题:《程序员面试宝典》—上海某大学校招试题(第三章)

----------------------------------------------------- 第三章 --------------------------------------------------------

1. 如果一个递归终会结束,那么这个函数一定:BC

A. 使用了局部变量。--------------------局部变量只在一次调用局部范围有效,出了这次调用的范围就无效了,它不能控制递归的结束。(考查局部变量生命周期/有效范围的问题)需要注意的就是局部变量不是局部静态变量。

B. 有一个分支不调用自身。--------------------如果没有一个分支不调用自身,递归就不会结束了。(这是在考查递归的定义)

C. 使用了全局变量或者使用了一个或多个参数----------------------------使用全局变量或使用一个或多个参数的确可以控制递归的结束,但除此之外局部静态变量也可以。局部静态变量,存放在堆中而不是栈中,只在函数内被访问,值是初始化的或者上一次处理后的内容。

2. C语言中指针变量可以相加减吗,含义是什么?

C语言中指针变量存放的是地址,如0x20000000

指针变量可以加减一个数,加就是向高地址移动,减就是向低地址移动。但加减的单元不是字节数,而是与数据类型有关,如果是int型指针,则指针+2表示地址值加了sizeof(int)*2。

指针变量的自加和自减实际上是与整数1的加减运算。

同类型指针之间可以比较大小,不同类型指针指针比较大小没有意义。

指针之间可以相减,但不可以相加,相减表示指针之间指向的内存位置间隔多少个元素。

3.c语言中.c和.h文件的困惑
本质上没有任何区别。 只不过一般:.h文件是头文件,内含函数声明、宏定义、结构体定义等内容

.c文件是程序文件,内含函数实现,变量定义等内容。而且是什么后缀也没有关系,只不过编译器会默认对某些后缀的文件采取某些动作。

你可以强制编译器把任何后缀的文件都当作c文件来编。

4.常见的时间复杂度

按数量级递增排列,常见的时间复杂度有:

常数阶O(1),  对数阶O(log2n),  线性阶O(n),  线性对数阶O(nlog2n),  平方阶O(n^2), 立方阶O(n^3),..., k次方阶O(n^k), 指数阶O(2^n) 。

其中,

(1).O(n),O(n^2), 立方阶O(n^3),..., k次方阶O(n^k) 为多项式阶时间复杂度,分别称为一阶时间复杂度,二阶时间复杂度。。。。

(2).O(2^n),指数阶时间复杂度,该种不实用

(3).对数阶O(log2n),   线性对数阶O(nlog2n),除了常数阶以外,该种效率最高

5.指针

 

#include <stdio.h> 
void foo(int* a, int* b){
	*a = *a + *b;
	*b = *a - *b;
	*a = *a - *b;
}
int main()
{           
	int a=1, b=2, c=3;
	foo(&a, &b);
	foo(&b, &c);
	foo(&c, &a);
	printf("%d,%d,%d", a,b,c);
	return 0;
}

函数的作用是交换两个指针指向变量的值,输出结果:1,3,2.

 

6. 实现两个N*N矩阵的乘法,矩阵由一维数组表示

7. 找到单向链表中间那一个,如果有两个则取前面一个

8. 长度为n的整数数组,找出其中任意(n-1)个乘积最大的那一组,只能用乘法,不可以用除法

该问题等价于:从 N 个整数中剔除一个,使余下的数乘积最大。

令这N个数依次为 a1,a2,...,an,P=a1*a2*...*an,

(1) 如果 P<0,则剔除其中最大的负整数即可(即绝对值最小的负数);

(2) 如果 P=0,

    2.1 若这 N 个数中有且仅有一个为“0”。若其它数之积为正,则剔除“0”;否则剔除任意一个非零数;

    2.2 若这 N 个数中至少有两个为“0”,则随便剔除一个均可;

(3) 如果 P>0,则剔除其中最小的正整数即可。

时间复杂度为O(n).

发布了392 篇原创文章 · 获赞 492 · 访问量 241万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览