1虫几、求下面函數(shù)的返回值
int func(x)
{
int countx = 0;
while(x)
{
countx++;
x = x&(x-1);
}
return countx;
}
問:假定x是9999辆脸,那么返回多少?
答:返回的是8啡氢,解題思路是將x轉(zhuǎn)化為二進制术裸,看含有多少個1,則就返回多少穗椅。
2、文件中有一組整數(shù)门坷,要求排序后輸出到另一個文件中
? ? ? ?如果數(shù)不多的情況下袍镀,可以直接將文件中所有整數(shù)讀到set<int>中,set類型會自動排好序苇羡,讀完后再將所有整數(shù)寫到另一個文件中去。
? ? ? ?而整數(shù)特別多內(nèi)存又不夠的情況下锦茁,可以分批讀叉存,每次讀一部分排好序?qū)懙揭粋€小文件中去,直到所有整數(shù)都讀取完成歼捏,這時每個小文件就都是排好序的了,然后將所有小文件中第一個數(shù)讀出來進行比較瓣履,選出最小的放到目標文件中去练俐,然后將該最小的數(shù)所在文件的下一個數(shù)讀取出來進行比較,這樣所有小文件都比完之后,目標文件中就是排好序的所有整數(shù)了浴韭。
? ? ? ?思路:這里采用的是大而化小脯宿,化整為零的手段。
3榴芳、使用遞歸將兩個有序鏈表合并為一個有序鏈表
? ? ? ?思路:理解遞歸,并定義好結(jié)束的條件
Node * Merge(Node *head1, Node* head2)
{
if (head1 == NULL)
return head2;
if (head2 == NULL)
return head1;
Node* head = NULL;
if (head1->data < head2->data)
{
head = head1;
head->next = Merge(head1->next, head2);
}
else
{
head = head2;
head->next = Merge(head1, head2->next);
}
return head;
}
4窟感、寫一個函數(shù)找出整數(shù)數(shù)組中第二大的數(shù)
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;
}
思路:定義兩個變量一直保存最大的兩個整數(shù)
5柿祈、如何判斷一個單鏈表是否有環(huán)
struct node
{
char val;
node* next;
}
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;
}
思路:第一個節(jié)點每次走一步哩至,第二個節(jié)點每次走兩步,即第一個節(jié)點走n步的時候卢佣,第二個節(jié)點走了2n步箭阶,如果是有環(huán)的鏈表,n和2n處必定是同一個節(jié)點仇参。
6、一個標準的strcpy函數(shù)
//strcpy的實現(xiàn):
char * strcpy(char* strDest, const char* strSrc)
{
assert( (strDest != NULL) && (strSrc != NULL));
char *address = strDest;
while( (*strDest++ = *strSrc++) != ‘\0’);
return address;
}
返回char*的原因:
返回strDest的原始值使得函數(shù)能夠支持鏈式表達式罩扇,增加了函數(shù)的附加值抓谴。同樣功能的函數(shù)寞缝,如果能合理地提高函數(shù)的可用性,自然就更加的理想荆陆。
7、嵌入式系統(tǒng)可能用到這樣的場景,即要求設(shè)置一絕對地址為0x67a9的整型變量的值為0xaa66棠枉,怎么設(shè)置泡挺?
int *ptr;
ptr = (int*)0x67a9;
*ptr = 0xaa66;
8、下面的代碼輸出是什么贱除?為什么?
void foo(void)
{
unsigned int a = 6;
int b = -20;
(a+b) > 6?puts(“>6”):puts(“<=6”);
}
結(jié)果是”>6”月幌,原因是當(dāng)表達式存在有符號類型和無符號類型時所有的操作對象都自動轉(zhuǎn)換為無符號類型悬蔽,因此-20變成一個非常大的整數(shù)與6相加,所以該表達式計算出的結(jié)果大于6.
9蝎困、strncpy和snprintf的正確用法
//strncpy的正確用法:
strncpy(dest,src,sizeof(dest)-1);
dest[strlen(dest)] = ‘\0’;
//snprintf的正確用法:
snprintf(dest, sizeof(dest)-1, “%s”, src);
總則:
1)snprintf的使用比strncpy簡潔
2)snprintf可以獲取被拷貝的字節(jié)數(shù)
3)二者都有性能問題录语,如果src長度遠大于dest钦无,用strncpy盖袭,否則用snprintf。
10鳄虱、printf中%5.3s,這樣的怎么看决记?
int main(void)
{
printf(“%s, %5.3s\n”, “computer”, “computer”);
return 0;
}
輸出:computer,com
? ? ? ?%5.3s 或者是 %5.3d 中小數(shù)點后面表示輸出的最大寬度倍踪,小數(shù)點前面的表示輸出的最小寬度;
? ? ? ?%5.3f則表示輸出場寬為9的浮點數(shù)建车, 其中小數(shù)位為3, 整數(shù)位為1潮罪, 小數(shù)點占一位, 不夠9位右對齊嫉到;
? ? ? ?默認都是右對齊, 若是%-7s則輸出左對齊