常見演算法及問題需注意的技巧與簡單實現

2021-10-09 17:51:03 字數 3498 閱讀 4395

1、合併兩個有序陣列a,b,並使合併後的陣列在a中。(假設a中有足夠的空間儲存兩個陣列中的元素)

void

mergesortedarray

(int a,

int m,

int b,

int n)

else

}while

(n>0)

while

(m>0)

}

1-1 寫乙個函式 void *memmove(void *dest, const void *src, size_t n) 將乙個字串陣列移動到目的位址為起點的位址。
void

*memmove

(void

*dest,

const

void

*src, size_t n)

else

return p1;

}

v = *p++; // * 和 ++ 同級,自右向左結合 等價於 v = *(p++)

​ // 先取p所指目標變數的值,賦予變數v; 再對 p 對進行增1,即指標p指向下乙個目標變數。

v = (*p)++; // 先將變數 *p 的值賦予v,再對變數 *p進行增1

技巧是:把當前節點的值用next的值覆蓋,然後刪除next節點

​ 相當於刪除當前節點,實際是刪除了next節點而將next的值拿來覆蓋了當前節點的值。

3、埃拉託色尼(the sieve of eratosthenes) 質數篩選法(常考點)

​ 演算法的核心思想:先將範圍內的數都假設為質數,然後從最小的質數開始,將質數的倍數更改為非質數。

//假設求2-200之間的質數

#include

#include

#define n 200

intmain()

}}int cnt =0;

//記錄質數個數

for(

int i=

2; i

++i)

}printf

("\n 質數個數為:\n",cnt)

;return0;

}

演算法的雙層迴圈處還可以優化以提高執行效率

//假設求2-200之間的質數

#include

#include

#define n 200

intmain()

}}int cnt =0;

//記錄質數個數

for(

int i=

2; i

++i)

}printf

("\n 質數個數為:\n",cnt)

;return0;

}

4、輸入一行字串,統計其中包括多少單詞,單詞之間用空格分隔。
#include

#include

main()

}else

space=0;

// 新空格 }if

(space==0)

//如果字串不以空格結束,則單詞數增 1

num=num+1;

printf

("單詞總數為: %d\n"

,num)

;//輸出結果

}

程式分析:本題容易出錯的地方主要是對字串前後空格的判斷。

5、反轉乙個單鏈表(reverse linked list)

遞迴法

struct listnode ;

//遞迴反轉整個鍊錶

struct listnode* reverse(struct listnode* head)

非遞迴法(迭代法)

typedef struct listnode listnode;

listnode reverselist(listnode head)

return pre;

}

6、編寫乙個函式,利用遞迴方法找出乙個陣列中的最大值和最小值,要求遞迴呼叫函式的格式如下:

minmaxvalue(arr,n,&max,&min),其中arr是給定的陣列,n是陣列的個數,max、min分別是最大值和最小值。

void

minmaxvalue

(int arr,

int n,

int* max,

int* min)

//這裡的man和min都是出參

else

}

7、乙個c語言程式的編譯到執行的過程

編譯:這裡的編譯不是指程式從原始檔到二進位制程式的全部過程,而是指將經過預處理之後的程式轉換成特定彙編**(assembly code)的過程。

彙編:將上一步的彙編**轉換成機器碼(machine code),這一步產生的檔案叫做目標檔案,是二進位制格式。這一步會為每乙個原始檔產生乙個目標檔案。

8、內聯函式

呼叫內聯函式時,編譯器首先檢查呼叫是否正確(型別安全檢查或者自動進行型別轉換)。

如果正確,則將內聯函式的**直接替換函式呼叫,並且用實參換形參,於是省去了函式呼叫的開銷

因此,內聯機制增加了空間開銷而節約了時間開銷。(空間換時間)

內聯函式與用 #define 命令實現的帶參巨集定義有些相似,但不完全相同:

用內聯函式可以達到用 #define 巨集置換的目的,但不會出現帶參巨集定義的***: 如自增運算時,容易出現錯誤,因為巨集是直接替換引數的,比如:

#define square(a) (a)*(a)

int a = 1;

int re = square(a++);

// 可能 a = 3 re = 2

// 因為編譯器可能以不同的方式對表示式((a++)*(a++)進行求值

慎用內聯函式1)使用內聯函式可以節省執行時間,但卻增加了目標程式的長度

2)函式體內出現迴圈或遞迴等複雜的結構控制語句時,s不適合定義為內聯函式

3)乙個好的編譯器將會根據函式的函式體,自動取消不值得的內聯

與朋友交往需注意的十個問題

朋友,是人際關係中甚為重要的交際物件,有的人與朋友交際有始無終 半途而廢 有的甚至反目成仇 相互暗算 攻訐。其實,說到底這都是沒有掌握與朋友成功交際的技巧。那麼,如何與朋友成功交際嘴 筆者以為,除了真誠和寬容外,還應該注意下面10個問題 1 傾聽朋友的訴說。作為朋友,你要學會傾聽。當你的朋友遇到挫折...

wcf獲取客戶端位址及一些需注意的問題

提供方法執行的上下文環境 operationcontext context operationcontext.current 獲取傳進的訊息屬性 messageproperties properties context.incomingmessageproperties 獲取訊息傳送的遠端終結點ip...

問卷設計及問卷調查中的問題與技巧

應該說社會調查與問卷技術並沒有直接關係,社會調查範圍很廣,方法也很多,10年一次的人口普查 新聞記者的個案追蹤以及我們經常使用的問卷調查,都可以稱之為社會調查。現在我們越來越多地使用問卷調查,這是一種蒐集的資料來反映總體的有效方法。但在問卷設計及調查分析中,有些問題我們卻往往忽略,首先我先簡單說一下...