昨天去聯發博動筆試了,人那個多呀,人山人海~~
說題目吧。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
第一題,請編寫兩個函數,函數的接口如下所示。第一個函數負責把一個ASCII字符串轉換成一個帶符號整數,第二個寒暑負責把一個帶符號的整數轉換爲一個ASCII字符串。
(1) int StrToInt(const char *Str);
(2) int IntToStr(int num, char *Str);
已知條件:傳遞給IntToStr函數的緩衝區的長度足以容納下int整數範圍內的數,傳遞給StrToInt
的字符串只包含數字和負號,是一個格式正確的整數值。
int StrToInt(char *Str)
{
assert(Str != NULL);
int num = 0;
char *p = Str;
int flag = 0;
if(*p == '-')
{
flag = 1;
p++;
}
while(*p !='/0')
{
num += (int)(*p - 48);
num *=10;
p++;
}
num /=10;
if(flag)
{
num = -num;
}
return num;
}
int IntToStr(int num, char *Str)
{
assert(Str != NULL);
char *p =Str;
if(num<0)
{
*p = '-';
p++;
num =-num;
}
while(num>0)
{
*p = (char)(num%10 + 48);
p++;
num /= 10;
}
*p = '/0';
char *q = Str;
if(*q == '-')
{
q++;
}
p--;
while(q < p)
{
char t = *q;
*q = *p;
*p = t;
q++;
p--;
}
return 1;
}
第二題:請實現二分搜索函數,該函數對一個排好序的整數數組進行二分法搜索,函數原型如下:
int BinarySearch(const int* array, int lower, int upper, int target);
其中lower和upper分別是需要進行搜索的開始和結束的索引值,分別用遞歸和非遞歸兩種方式實現該函數。
遞歸:
int BinarySearch(const int* array, int lower, int upper, int target)
{
if(lower > upper){
return -1;
}
int mid = lower + (upper - lower)/2;
if(target == *(array + mid))
{
return mid;
}
else if (target < *(array + mid))
{
return BinarySearch(array, lower, mid - 1, target);
}
else {
return BinarySearch(array, mid +1, upper, target);
}
}
非遞歸:
int BinarySearch(const int* array, int lower, int upper, int target)
{
assert(upper > = lower);
while(lower <= upper){
int mid = lower + (upper - lower)/2;
if(target == *(array + mid))
{
return mid;
}
else if (target < *(array + mid))
{
upper = mid - 1;
}
else {
lower = mid +1;
}
}
return -1;
}
問答題。
1.下列程序的運行有什麼結果或效果。
#define MAX 255
int main(void){
unsigned char i;
unsigned char a[MAX];
for(i=0; i<=MAX; i++)
{
a[i] = i;
}
return 0;
}
無限循環
2.在32位小端字序系統裏,
Char array[16] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
Char *cp=array;
int *ip=(int*)array;
問
(1)*(cp+2)=?
(2) *(ip+2)=?
*(cp+2)應該是2所對應的ASCII碼吧,*(ip+2)=185207048(VC6.0的結果,不知道怎麼算出來的,偶怎麼也算不出這個數)
3. c是一個char型的變量,c的取值範圍是多少。如果c的值是0xf0,那麼c>>3 =?,請給出十進制的答案。
0x00~0xff,即0~255(難道是-128~127?)
c>>3= -16(vc6.0的結果,不知道爲什麼)
4.調用函數時,請列舉不使用函數原型潛在的風險。
這個的詳細答案在另外的文章,請參考:
http://blog.csdn.net/haiyan0106/archive/<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />2008/10/09/3043998.aspx
5.以下程序有什麼問題。如果有問題,那該程序運行是正確的,爲什麼。
int ExchangeValue(int *pa, int *pb)
{
int *pt;
If(pa== NULL || pb==NULL)
Return 0;
*pt = *pa;
*pa = *pb;
*pb =*pt;
return 1;
}
int *pt = new int(1);
沒有爲pt所指向的對象分配空間,造成運行錯誤。
6.
int i1;
Const char *p1 = “AAA”;
int main(){
static int i2;
int i3;
int *i4 = malloc(sizeof(int));
}
上面程序中的變量(i1,ip1,i2,i3,i4)分別存在於哪些內存位置(數據段,堆棧,堆)?i1,i2,i3,*i4的值是什麼.
i3,i4棧,i1,p1,i2靜態數據段。i1=0,i2=0,i3,*i4爲隨機值。
7。下列哪些語句沒有編譯和運行錯誤,對有錯誤的組,說明哪些語句是錯誤的,爲什麼。
A) const int a;//只讀,必須初始化
B) char *pa =”AAA”;
const char *pb = “BBB”;
pb = pa;//正確
C)
char *pa = “AAA”:
char *const pb =”BBB”;
char *const pc = (char *)malloc(4);
*pb=’A’;//這個
*(pc+1) = ‘A’;
Pb = pa;//pb是一個常指針,不能爲左值
D)
Char *pa;
Const char* const pb=”BBB”;
Char * const pc;//和A一樣,得初始化
Pa = “AAA”;
Pc = pa;//as same as C)
8. 用變量a給出下面的定義
舉例:
一個整型數(An integer) int a;
1)一個指向指針的的指針,它指向的指針是指向一個整型數( A pointer to a pointer to an intege)r
2)一個有10個整型數的數組( An array of 10 integers)
3) 一個有10個 指針的數組,該指針是指向一個整型數的。(An array of 10 pointers to integers)
4) 一個指向有10個整型數數組的指針( A pointer to an array of 10 integers)
5) 一個指向函數的指針,該函數有一個整型參數並返回一個整型數(A pointer to a function that takes an integer as an argument and returns an integer)
6) 一個有10個指針的數組,該指針指向一個函數,該函數有一個整型參數並返回一個整型數( An array of ten pointers to functions that take an integer argument and return an integer )
1) int **a;
2) int a[10];
3) int *a[10];
4) int (*a)[10];
5) int (*a)(int);
6) int (*a[10])(int);
9.將兩個有符號16位數分別放入有符號32位的高16位和低16位,寫代碼。不要使用函數返回值傳遞數據。
Void put(short num1, short num2, int& result)
{
int t = (int)num1;
result = (t<<16)+ num2;
}
10.下面是一個用來刪除單向鏈表頭節點的函數,請找出其中程序的漏洞並加以改正。
void RemoveHead(node *head)
{
free(head);
head = head->next;
}
改正:
void RemoveHead(node **head)
{
node *p = *head;
*head = (*head)->next;
free(p);
}
這個公司連面試機會都沒有給我,聽說已經有同學拿到了offer,效率真高。人家都說80%的offer掌握在20%的人手裏。而我是80%的人。加油吧。