閱讀屋>筆試> 華為C/C++筆試題系列二

華為C/C++筆試題系列二

華為C/C++筆試題系列二

華為筆試題;C;C++;

1.說出下面這個程式的執行結果,並簡要敘述其理由:

char buf1[10]="hello";

char buf2[10]="hello";

if (buf1==buf2)

printf("equal!");

else printf("not equal!");

答:因為buf1,buf2分配了不同的記憶體塊,而比較的是陣列名,實際上是兩個分別指向陣列起始元素地址的指標。

2.指出下面這段程式中存在一些什麼問題:

int loop,a[5];

int* p=a;

for (loop=0;loop<5;loop++)< p="">

{ p++;

*p=loop;

}

答:陣列a[5]在建立時沒有初始化, 在for迴圈裡也沒有起到完全初始化陣列的作用,而且對一塊未知記憶體賦值。在最後一輪迴圈結束時p指向了陣列a[5]的最後一個元素的下一個地址。

string 系列

char * strcpy( char *strDest, const char *strSrc )

{

assert( (strDest != NULL) && (strSrc != NULL) );

char *address = strDest;

while( (*strDest++ = * strSrc++) != ‘\0’ );

return address;

}

char* strncpy(char* strdest, const char* strsrc, int n)

{

assert((strdest != NULL) && (strsrc != NULL));

char* address = strdest;

while(n-- > 0)

*strdest++ = *strsrc++;

return address;

}

int strcmp(const char* str1, const char* str2)

{

assert((str1 != NULL) && (str2 != NULL);

int ret = 0;

while (!(ret = (unsigned char*)*str1 - (unsigned char*)*str2) && (*str2))

{

str1++;

str2++;

}

if (ret > 0)

ret = 1;

else if (ret < 0)

ret = -1;

return ret;

}

int strlen(const char* str)

{

assert(str != NULL);

int len = 0;

while (\ != *str++)

len++;

return len;

}

類string的建構函式

string::string(const char* str)

{

if(str == NULL)

{

m_data = new char[1];

*m_data = \;

}

else

{

int length = strlen(str);

m_data = new char[str + 1];

strcpy(m_data, str);

}

}

string 的解構函式

string::~string()

{

[] m_data;

}

string 的複製建構函式

string ::string(const string& other)

{

int len = strlen(other.m_data);

m_data = new char[len + 1];

strcpy(m_data, other.m_data);

}

string 的賦值函式

string& string::operator=(const string& other)

{

if (this == &other)

return *this;

[] m_data;

int len = strlen(other.m_data);

m_data = new char[len + 1];

strcpy(m_data, other.m_data);

return *this;

}

不用任何區域性和全域性變數實現int strlen(char *a)

int strlen(char *a) {

if(\ == *a)

return 0;

else

return 1 + strlen(a + 1);

}

1)sizeof相關係列問題

2)const相關係列問題

3)大量林銳書的習題,以及各種變種

這三個幾乎是每次必出現,下面的這些是程式相關題,很多都是以前有討論過的'

1)求出相似度的演算法.

2)寫出二分查詢的程式碼.

int binary_search(int* arr, int key, int n)

{

int low = 0;

int high = n - 1;

int mid;

while (low <= high)

{

mid = (high + low) / 2;

if (arr[mid] > k)

high = mid - 1;

else if (arr[mid] < k)

low = mid + 1;

else

return mid;

}

return -1;

}

3)寫出在母串中查詢子串出現次數的程式碼.

*4)寫出快速排序或者某種排序演算法程式碼

出現次數相當頻繁

5)寫出查詢從一個集合中輸出所有子集合的演算法.

6)實現strcpy函式

char* strcpy(char* dest, const char* src)

{

assert((dest != NULL) && (src != NULL));

char* address = dest;

while (\ != (*dest++ = *src++));

return address;

}

出現次數相當頻繁

7)實現strcmp函式

int mystrcmp(const char* str1, const char* str2)

{

assert((str1 != NULL) && (str2 != NULL));

int ret = 0;

while (!(ret = *(unsigned char*)str1 - *(unsigned char*)str2) && *str2)

{

str1++;

str2++;

}

if (ret > 0)

ret = 1;

else if (ret < 0)

ret = -1;

return ret;

}

出現次數相當頻繁

8)將一個單鏈表逆序

struct test

{

int number;

double score;

test* next;

}

void reverse(test*& head)

{

test* pe = head;

test* ps = head->next;

while(ps != NULL)

{

pe->next = ps->next;

ps->next = head;

head = ps;

ps = pe->next;

}

}

9)迴圈連結串列的節點對換和刪除。

10)將一個數字字串轉換為數字."1234" -->1234

#i nclude

using namespace std;

int f(char* s)

{

int k = 0;

while (*s)

{

k = 10 * k + (*s++)- ;

}

return k;

}

int main()

{

int digit = f("4567");

cout<

cin.get();

}

出現次數相當頻繁

11)實現任意長度的整數相加或者相乘功能。

12)寫函式完成記憶體的複製

一個記憶體複製函式的實現體

void *memcpy(void *pvTo,const void *pvFrom,size_t size)

{

assert((pvTo!=NULL)&&(pvFrom!=NULL));

byte *pbTo=(byte*)pvTo; //防止地址被改變

byte *pbFrom=(byte*)pvFrom;

while (size-- >0)

*pbTo++ = *pbForm++;

return pvTo;

}

出現次數相當頻繁(華為筆試)

1)寫一個記憶體複製函式,不用任何庫函式.就是前些時候本版討論的那個問題.

void* memcpy(void* pvTo, const void* pvFrom, size_t size)

{

assert((pvTo != NULL) && (pvFrom != NULL));

byte* pbTo = pvTo;

byte* pbFrom = pbFrom;

while (size-- > 0)

{

*pbTo++ = *pbFrom++;

}

return pvTo;

}

2)將一個單鏈表逆序.(這個問題是個常規的資料結構問題.不過不小心時會損失效率)

3)客房預定的問題.根據客戶報的人數,客房等級來從預備的客房中選擇出所有符合要求的

客房號.客戶沒有要求等級時,只考慮人數因素就可以了.要考慮有些客房已經預定的情況.

(寫程式碼是要考慮好彼此的效率)

5)將一個數字字串轉換為數字."1234" -->1234

int convert(char* str)

{

int k = 0;

while (*str != \)

{

k = k * 10 + *s++ - ;

}

return k;

}

【華為C/C++筆試題系列二】相關文章: