int Strcmp(char *str1, char *str2)
{
?? int i=0;
?? int b=0;
?? while(str1[i]||str2[i])
?? {
????? if(str1[i]>str2[i])
????? {
???????? b=1;break;
????? }
????? else if(str1[i]<str2[i])
????? {
???????? b=-1;break;
????? }
????? i++;
?? }
?? return b;
}
***************************************************************************************************************
1.說(shuō)出下面這個(gè)程序的運(yùn)行結(jié)果,并簡(jiǎn)要敘述其理由:
char buf1[10]="hello";
char buf2[10]="hello";
if (buf1==buf2)
printf("equal!");
else printf("not equal!");
因?yàn)閎uf1,buf2分配了不同的內(nèi)存塊,而比較的是數(shù)組名,實(shí)際上是兩個(gè)分別指向數(shù)組起始元素地址的指針。
2.指出下面這段程序中存在一些什么問(wèn)題:
int loop,a[5];
int* p=a;
for (loop=0;loop<5;loop++)
{ p++;
*p=loop;
}
數(shù)組a[5]在創(chuàng)建時(shí)沒(méi)有初始化, 在for循環(huán)里也沒(méi)有起到完全初始化數(shù)組的作用,而且對(duì)一塊未知內(nèi)存賦值。在最后一輪循環(huán)
結(jié)束時(shí)p指向了數(shù)組a[5]的最后一個(gè)元素的下一個(gè)地址。
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 ('\0' != *str++)
????? len++;
?? return len;
}
類string的構(gòu)造函數(shù)
string::string(const char* str)
{
?? if(str == NULL)
?? {
????? m_data = new char[1];
????? *m_data = '\0';
??? }
??? else
??? {
?????? int length = strlen(str);
?????? m_data = new char[str + 1];
?????? strcpy(m_data, str);
???? }
}
string 的析構(gòu)函數(shù)
string::~string()
{
?? delete [] m_data;
}
string 的拷貝構(gòu)造函數(shù)
string ::string(const string& other)
{
?? int len = strlen(other.m_data);
?? m_data = new char[len + 1];
?? strcpy(m_data, other.m_data);
}
string 的賦值函數(shù)
string& string::operator=(const string& other)
{
?? if (this == &other)
????? return *this;
?? delete [] m_data;
?? int len = strlen(other.m_data);
?? m_data = new char[len + 1];
?? strcpy(m_data, other.m_data);
?? return *this;
}??
不用任何局部和全局變量實(shí)現(xiàn)int strlen(char *a)
int strlen(char *a) {
??? if('\0' == *a)
??????? return 0;
??? else
??????? return 1 + strlen(a + 1);
}
1)sizeof相關(guān)系列問(wèn)題
2)const相關(guān)系列問(wèn)題
3)大量林銳書的習(xí)題,以及各種變種
這三個(gè)幾乎是每次必出現(xiàn)
下面的這些是程序相關(guān)題,很多都是以前有討論過(guò)的,還請(qǐng)各位大俠能整理個(gè)比較適合做面試時(shí)答案的解答,多謝了.最好能給出
討論鏈接,讓我等后輩有學(xué)習(xí)的機(jī)會(huì).
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)寫出在母串中查找子串出現(xiàn)次數(shù)的代碼.
*4)寫出快速排序或者某種排序算法代碼
出現(xiàn)次數(shù)相當(dāng)頻繁
5)寫出查找從一個(gè)集合中輸出所有子集合的算法.
*6)實(shí)現(xiàn)strcpy函數(shù)
char* strcpy(char* dest, const char* src)
{
?? assert((dest != NULL) && (src != NULL));
?? char* address = dest;
?? while ('\0' != (*dest++ = *src++));
?? return address;
}
出現(xiàn)次數(shù)相當(dāng)頻繁
*7)實(shí)現(xiàn)strcmp函數(shù)
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;
}
??
出現(xiàn)次數(shù)相當(dāng)頻繁
8)將一個(gè)單鏈表逆序
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)循環(huán)鏈表的節(jié)點(diǎn)對(duì)換和刪除。
*10)將一個(gè)數(shù)字字符串轉(zhuǎn)換為數(shù)字."1234" -->1234
#i nclude<iostream>
using namespace std;
int f(char* s)
{
?? int k = 0;
?? while (*s)
?? {
????? k = 10 * k + (*s++)- '0';
?????
?? }
?? return k;
}
int main()
{
?? int digit = f("4567");
?? cout<<digit<<endl;
?? cin.get();
}
出現(xiàn)次數(shù)相當(dāng)頻繁
11)實(shí)現(xiàn)任意長(zhǎng)度的整數(shù)相加或者相乘功能。
*12)寫函數(shù)完成內(nèi)存的拷貝
一個(gè)內(nèi)存拷貝函數(shù)的實(shí)現(xiàn)體
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;
}
出現(xiàn)次數(shù)相當(dāng)頻繁
?
.筆試:
1)寫一個(gè)內(nèi)存拷貝函數(shù),不用任何庫(kù)函數(shù).就是前些時(shí)候本版討論的那個(gè)問(wèn)題.
?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)將一個(gè)單鏈表逆序.(這個(gè)問(wèn)題是個(gè)常規(guī)的數(shù)據(jù)結(jié)構(gòu)問(wèn)題.不過(guò)不小心時(shí)會(huì)損失效率)
3)客房預(yù)定的問(wèn)題.根據(jù)客戶報(bào)的人數(shù),客房等級(jí)來(lái)從預(yù)備的客房中選擇出所有符合要求的
客房號(hào).客戶沒(méi)有要求等級(jí)時(shí),只考慮人數(shù)因素就可以了.要考慮有些客房已經(jīng)預(yù)定的情況.
(寫代碼是要考慮好彼此的效率)
4)對(duì)于一個(gè)無(wú)序序列進(jìn)行二分查找
線排序再查找
5)將一個(gè)數(shù)字字符串轉(zhuǎn)換為數(shù)字."1234" -->1234
int convert(char* str)
{
?? int k = 0;
?? while (*str != '\0')
?? {
????? k = k * 10 + *s++ - '0';
?? }
?? return k;
}
6)在文件(調(diào)用庫(kù)函數(shù)創(chuàng)建的,不用考慮數(shù)據(jù)庫(kù)的方式)中讀入信息(包括職工號(hào),職工產(chǎn)量)
.根據(jù)輸入的信息(包括職工號(hào),職工產(chǎn)量)..檢測(cè)是否有相同的職工號(hào)記錄,如有,則增加其
產(chǎn)量.如沒(méi)有,則創(chuàng)建新的記錄.最后的記錄排序的依據(jù)是職工產(chǎn)量(降序),如果產(chǎn)量相同,則
按職工號(hào)(升序). (具體的題目記不太清了,這個(gè)題目有點(diǎn)長(zhǎng).哪位也去筆試了.請(qǐng)修正一下
子)
.
2.面試
1)找出兩個(gè)中文句子的相似度.(例如"中國(guó)江蘇南京" "江蘇省中國(guó)南京市".實(shí)際上是指的
同一個(gè)地方.面試官的要求是一分鐘給出求相似度的算法.)(幸好聽老師講過(guò)中文分詞,要不
然當(dāng)場(chǎng)就掛了)
2)寫出二分查找的代碼.
3)將上述代碼通用化.(在 C 的規(guī)范內(nèi).就是我前面所的那個(gè)問(wèn)題)
4)寫出在母串中查找子串出現(xiàn)次數(shù)的代碼.(不顧及效率時(shí)好說(shuō).當(dāng)時(shí)一不留神把 KMP 說(shuō)了
出來(lái),結(jié)果又讓我描述整個(gè)過(guò)程.汗..只好從頭又學(xué)了.不過(guò)沒(méi)有冷場(chǎng),邊學(xué)邊說(shuō).hoho)
5)如何看待在函數(shù)中定義很多靜態(tài)變量.
6)寫出quick_sort
7)寫出查找從一個(gè)集合中輸出所有子集合的算法.
8)有關(guān)于各種類型指針.各種數(shù)據(jù)類型的 sizeof 運(yùn)算結(jié)果( 在 C 中)