面试小程序

1.求下面函数的返回值
int func(x)
{
int countx = 0;
while(x)
{
countx ++;
x = x&(x-1);
}
return countx;
}
假定x = 9999。 答案:8
思路:将x转化为2进制,看含有的1的个数。
--------------------------------------------------------------------------

2.There are two int variables: a and b, don’t use “if”, “? :”, “switch”or other judgement statements, find out the biggest one of the two numbers.
答案:( ( a + b ) + abs( a - b ) ) / 2
--------------------------------------------------------------------------

3.文件中有一组整数,要求排序后输出到另一个文件中
答案:
#include<iostream>
#include<fstream>
using namespace std;

void Order(vector<int>& data) //bubble sort
{
int count = data.size() ;
int tag = false ; // 设置是否需要继续冒泡的标志位
for ( int i = 0 ; i < count ; i++)
{
for ( int j = 0 ; j < count - i - 1 ; j++)
{
if ( data[j] > data[j+1])
{
tag = true ;
int temp = data[j] ;
data[j] = data[j+1] ;
data[j+1] = temp ;
}
}
if ( !tag )
break ;
}
}

void main( void )
{
vector<int>data;
ifstream in("c://data.txt");
if ( !in)
{
cout<<"file error!";
exit(1);
}
int temp;
while (!in.eof())
{
in>>temp;
data.push_back(temp);
}
in.close(); //关闭输入文件流
Order(data);
ofstream out("c://result.txt");
if ( !out)
{
cout<<"file error!";
exit(1);
}
for ( i = 0 ; i < data.size() ; i++)
out<<data[i]<<" ";
out.close(); //关闭输出文件流
}
--------------------------------------------------------------------------

4.分析一下这段程序的输出 (Autodesk)
class B
{
public:
B()
{
cout<<"default constructor"<<endl;
}
~B()
{
cout<<"destructed"<<endl;
}
B(int i):data(i) //B(int) works as a converter ( int -> instance of B)
{
cout<<"constructed by parameter " << data <<endl;
}
private:
int data;
};

B Play( B b)
{
return b ;
}

(1)                                                                      results:
int main(int argc, char* argv[])                     constructed by parameter 5
{                                                                         destructed B(5)形参析构
B t1 = Play(5); B t2 = Play(t1);                   destructed t1形参析构
return 0;                 destructed t2 注意顺序!
}                                                                         destructed t1

(2)                                                                      results:
int main(int argc, char* argv[])                     constructed by parameter 5
{                                                                         destructed B(5)形参析构
B t1 = Play(5); B t2 = Play(10);                  constructed by parameter 10
return 0;                 destructed B(10)形参析构
}                                                                         destructed t2 注意顺序!
                                                                          destructed t1
--------------------------------------------------------------------------

5. 写一个函数找出一个整数数组中,第二大的数 (microsoft)
答案:
const int MINNUMBER = -32767 ;
int find_sec_max( int data[] , int count)
{
int maxnumber = data[0] ;
int sec_max = MINNUMBER ;
for ( int i = 1 ; i < count ; i++)
{
if ( data[i] > maxnumber )
{
sec_max = maxnumber ;
maxnumber = data[i] ;
}
else
{
if ( data[i] > sec_max )
sec_max = data[i] ;
}
}
return sec_max ;
}
--------------------------------------------------------------------------

6. 如何判断一个单链表是有环的?(注意不能用标志位,最多只能用两个额外指针)
struct node { char val; node* next;};
bool check(const node* head) {} //return false : 无环;true: 有环
答案:
一种O(n)的办法就是(搞两个指针,一个每次递增一步,一个每次递增两步,如果有环的话两者必然重合,反之亦然):
bool check(const node* head)
{
if(head==NULL) return false;
node *low=head, *fast=head->next;
while(fast!=NULL && fast->next!=NULL)
{
low=low->next;
fast=fast->next->next;
if(low==fast) return true;
}
return false;
}
--------------------------------------------------------------------------

7. 写一个在一个字符串(n)中寻找一个子串(m)第一个位置的函数。
答案:
KMP算法效率最好,时间复杂度是O(n+m)。
--------------------------------------------------------------------------

8. #include "stdafx.h"
#define SQR(X) X*X

int main(int argc, char* argv[])
{
int a = 10;
int k = 2;
int m = 1;

a /= SQR(k+m)/SQR(k+m);
printf("%d/n",a);

return 0;
}
这道题目的结果是什么啊?
答案:
define 只是定义而已,在编择时只是简单代换X*X而已,并不经过算术法则的。
a /= (k+m)*(k+m)/(k+m)*(k+m);
=>a /= (k+m)*1*(k+m);
=>a = a/9;
=>a = 1;
--------------------------------------------------------------------------

9.下面的代码有什么问题?
void DoSomeThing(...)
{
char* p;
...
p = malloc(1024); // 分配1K的空间
if (NULL == p)
return;
...
p = realloc(p, 2048); // 空间不够,重新分配到2K
if (NULL == p)
return;
...
}

A:
p = malloc(1024); 应该写成: p = (char *) malloc(1024);
没有释放p的空间,造成内存泄漏。

--------------------------------------------------------------------------
10.下面的代码有什么问题?并请给出正确的写法。
void DoSomeThing(char* p)
{
char str[16];
int n;
assert(NULL != p);
scanf(p, "%s%d", str, n);
if (0 == strcmp(str, "something"))
{
...
}
}

A:
scanf(p, "%s%d", str, n); 这句该写成: scanf(p, "%s%d", str, &n);
--------------------------------------------------------------------------

11.下面代码有什么错误?
void test1()
{
char string[10];
char *str1="0123456789";
strcpy(string, str1);
}

数组越界。
--------------------------------------------------------------------------

12.下面代码有什么问题?
void test2()
{
char string[10], str1[10];
for(i=0; i<10;i++)
{
str1[i] ='a';
}
strcpy(string, str1);
}

数组越界。
--------------------------------------------------------------------------

13.下面代码有什么问题?
void test3(char* str1)
{
char string[10];
if(strlen(str1)<=10)
{
strcpy(string, str1);
}
}

数组越界。
strcpy拷贝的结束标志是查找字符串中的\0 因此如果字符串中没有遇到\0的话 会一直复制,直到遇到\0,上面的123都因此产生越界的情况。
建议使用 strncpy 和 memcpy。
--------------------------------------------------------------------------

13.写出运行结果:
{
char str[] = "world"; cout << sizeof(str) << ": ";
char *p = str; cout << sizeof(p) << ": ";
char i = 10; cout << sizeof(i) << ": ";
void *pp = malloc(10); cout << sizeof(p) << endl;
}
答案:
6:4:1:4
注意:字符串(字符数组)以'\0'结尾。
若把前两行的sizeof(占用内存大小)改为strlen(数组长度),则输出均为5。
--------------------------------------------------------------------------

14.写出运行结果:
{
union V {
struct X {
unsigned char s1:2;//char t:4;就是4bit的字符变量,同样unsigned short i:8;就是8bit的无符号短整形变量
unsigned char s2:3;
unsigned char s3:3;
} x;

unsigned char c;
} v;

v.c = 100;
printf("%d", v.x.s3);

}
答案:
3
--------------------------------------------------------------------------

15.用C++写个程序,如何判断一个操作系统是16位还是32位的?不能用sizeof()函数
答案:
A1:
16位的系统下,
int i = 65536;
cout << i; // 输出0;
int i = 65535;
cout << i; // 输出-1;

32位的系统下,
int i = 65536;
cout << i; // 输出65536;
int i = 65535;
cout << i; // 输出65535;

A2:
int a = ~0;
if( a>65536 )
{
cout<<"32 bit"<<endl;
}
else
{
cout<<"16 bit"<<endl;
}
--------------------------------------------------------------------------

16.在不用第三方参数的情况下,交换两个参数的值
方法一:
i=i+j;
j=i-j;
i=i-j;//这样可能溢出
方法二:
i^=j;
j^=i;
i^=j;

方法三:
// 用加减实现,而且不会溢出
a = a+b-(b=a)
--------------------------------------------------------------------------

17.int i=10, j=10, k=3; k*=i+j; k最后的值是?
答案:
60

--------------------------------------------------------------------------
18.进程间通信的方式有?
答案:
进程间通信的方式有 共享内存, 管道 ,Socket ,消息队列 , DDE等

--------------------------------------------------------------------------
19. struct A
{
char t:4;
char k:4;
unsigned short i:8;
unsigned long m;
}
sizeof(A)=?
答案:
考虑边界对齐输出8,若不考虑边界对齐的话是7(1+2+4)。
--------------------------------------------------------------------------
20. 输出结果
int add_n(int n)
{
static int i=100;
i+=n;
return i;
}
int main(int argc, char* argv[])
{
int i=add_n(10);
int j=add_n(10);
cout<<i<<endl;
cout<<j<<endl;
return 0;
}
答案:20
20
--------------------------------------------------------------------------
21. 输出结果
union a {
int a_int1;
double a_double;
int a_int2;
};

typedef struct
{
a a1;
char y;
} b;

class c
{
double c_double;
b b1;
a a2;

};

输出cout<<sizeof(c)<<endl;的结果?
答案:32(8+16+8)
--------------------------------------------------------------------------

22.i最后等于多少?
int i = 1;
int j = i++;
if((i>j++) && (i++ == j)) i+=j;

答:
i = 5
--------------------------------------------------------------------------
23. 数据库:抽出部门,平均工资,要求按部门的字符串顺序排序,不能含有"human resource"部门,
employee结构如下:employee_id, employee_name, depart_id,depart_name,wage
答:
select depart_name, avg(wage)
from employee
where depart_name <> 'human resource'
group by depart_name
order by depart_name

--------------------------------------------------------------------------
24. 给定如下SQL数据库:Test(num INT(4)) 请用一条SQL语句返回num的最小值,但不许使用统计功能,如MIN,MAX等
答:
select top 1 num
from Test
order by num desc

--------------------------------------------------------------------------
25.请指出下列程序中的错误并且修改
void GetMemory(char *p){
p=(char *)malloc(100);
}
void Test(void){
char *str=NULL;
GetMemory(str);
strcpy(str,"hello world");
printf(str);
}

错误--参数的值改变后,不会传回
GetMemory并不能传递动态内存,Test函数中的 str一直都是 NULL。
strcpy(str, "hello world");将使程序崩溃。

修改如下:
char *GetMemory(){
char *p=(char *)malloc(100);
return p;
}
void Test(void){
char *str=NULL;
str=GetMemory();
strcpy(str,"hello world");
printf(str);
}

方法二:void GetMemory2(char **p)变为二级指针.
void GetMemory2(char **p, int num)
{
*p = (char *)malloc(sizeof(char) * num);
}































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值