iOS套路面試題之必考筆試手寫算法題

由于iOS就業市場經歷過被培訓機構一火車一火車輸送人才的階段,所以各大公司都喜歡出一點基礎算法筆試題,在下不才,做了一些題目的總結,如有補充或者錯誤,跪謝各位私信提醒我~~~

以下基本上以C語言實現為主

1.不用中間變量,用兩種方法交換A和B的值?

// 1.中間變量
void swap(int a, int b) {
   int temp = a;
   a = b;
   b = temp;
}

// 2.加法
void swap(int a, int b) {
   a = a + b;
   b = a - b;
   a = a - b;
}

// 3.異或(相同為0,不同為1. 可以理解為不進位加法)
void swap(int a, int b) {
   a = a ^ b;
   b = a ^ b;
   a = a ^ b;
}

2.求最大公約數?

/** 1.直接遍歷法 */
int maxCommonDivisor(int a, int b) {
    int max = 0;
    for (int i = 1; i <=b; i++) {
        if (a % i == 0 && b % i == 0) {
            max = i;
        }
    }
    return max;
}
/** 2.輾轉相除法 */
int maxCommonDivisor(int a, int b) {
    int r;
    while(a % b > 0) {
        r = a % b;
        a = b;
        b = r;
    }
    return b;
}

// 擴展:最小公倍數 = (a * b)/最大公約數

3.模擬棧操作?

 /**
 *  棧是一種數據結構,特點:先進后出
 *  練習:使用全局變量模擬棧的操作
 */
#include <stdio.h>
#include <stdbool.h>
#include <assert.h>
//保護全局變量:在全局變量前加static后,這個全局變量就只能在本文件中使用
static int data[1024];//棧最多能保存1024個數據
static int count = 0;//目前已經放了多少個數(相當于棧頂位置)

//數據入棧 push
void push(int x){
    assert(!full());//防止數組越界
    data[count++] = x;
}
//數據出棧 pop
int pop(){
    assert(!empty());
    return data[--count];
}
//查看棧頂元素 top
int top(){
    assert(!empty());
    return data[count-1];
}

//查詢棧滿 full
bool full() {
    if(count >= 1024) {
        return 1;
    }
     return 0; 
}

//查詢???empty
bool empty() {
    if(count <= 0) {
        return 1;
    }
    return 0;
}

int main(){
    //入棧
    for (int i = 1; i <= 10; i++) {
        push(i);
    }
  
    //出棧
    while(!empty()){
        printf("%d ", top()); //棧頂元素
        pop(); //出棧
    }
    printf("\n");
    
    return 0;
}

4.排序算法?

選擇排序、冒泡排序、插入排序三種排序算法可以總結為如下:
都將數組分為已排序部分和未排序部分。

  1. 選擇排序將已排序部分定義在左端,然后選擇未排序部分的最小元素和未排序部分的第一個元素交換。
  2. 冒泡排序將已排序部分定義在右端,在遍歷未排序部分的過程執行交換,將最大元素交換到最右端。
  3. 插入排序將已排序部分定義在左端,將未排序部分元的第一個元素插入到已排序部分合適的位置。

選擇排序

/** 
 *  【選擇排序】:最值出現在起始端
 *  
 *  第1趟:在n個數中找到最小(大)數與第一個數交換位置
 *  第2趟:在剩下n-1個數中找到最小(大)數與第二個數交換位置
 *  重復這樣的操作...依次與第三個、第四個...數交換位置
 *  第n-1趟,最終可實現數據的升序(降序)排列。
 *
 */
void selectSort(int *arr, int length) {
    for (int i = 0; i < length - 1; i++) { //趟數
        for (int j = i + 1; j < length; j++) { //比較次數
            if (arr[i] > arr[j]) {
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
        }
    }
}

冒泡排序

/** 
 *  【冒泡排序】:相鄰元素兩兩比較,比較完一趟,最值出現在末尾
 *  第1趟:依次比較相鄰的兩個數,不斷交換(小數放前,大數放后)逐個推進,最值最后出現在第n個元素位置
 *  第2趟:依次比較相鄰的兩個數,不斷交換(小數放前,大數放后)逐個推進,最值最后出現在第n-1個元素位置
 *   ……   ……
 *  第n-1趟:依次比較相鄰的兩個數,不斷交換(小數放前,大數放后)逐個推進,最值最后出現在第2個元素位置 
 */
void bublleSort(int *arr, int length) {
    for(int i = 0; i < length - 1; i++) { //趟數
        for(int j = 0; j < length - i - 1; j++) { //比較次數
            if(arr[j] > arr[j+1]) {
                int temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        } 
    }
}

5.折半查找(二分查找)

/**
 *  折半查找:優化查找時間(不用遍歷全部數據)
 *
 *  折半查找的原理:
 *   1> 數組必須是有序的
 *   2> 必須已知min和max(知道范圍)
 *   3> 動態計算mid的值,取出mid對應的值進行比較
 *   4> 如果mid對應的值大于要查找的值,那么max要變小為mid-1
 *   5> 如果mid對應的值小于要查找的值,那么min要變大為mid+1
 *
 */ 

// 已知一個有序數組, 和一個key, 要求從數組中找到key對應的索引位置 
int findKey(int *arr, int length, int key) {
    int min = 0, max = length - 1, mid;
    while (min <= max) {
        mid = (min + max) / 2; //計算中間值
        if (key > arr[mid]) {
            min = mid + 1;
        } else if (key < arr[mid]) {
            max = mid - 1;
        } else {
            return mid;
        }
    }
    return -1;
}

6.9*9乘法表?

main(){
 int x,y,z;
 for(x=1;x<=9;x++){
  for(y=1;y<=x;y++) {
   z=x*y;
   printf("%d*%d=%d  ",y,x,z);
  }
  printf("\n");
 }
}

6.設一個數為n,則在C語言中其個位、十位、百位、千位依次這樣計算:n/1%10,n/10%10,n/100%10,n/1000%10?

int main(){
    int n = 123456;
    int unitPlace = n / 1 % 10;
    int tenPlace = n / 10 % 10;
    int hundredPlace = n / 100 % 10;
    int thousandPlace = n / 1000 % 10;
    printf("個位:%d\n十位:%d\n百位:%d\n千位:%d\n", unitPlace, tenPlace, hundredPlace, thousandPlace);
 
    getchar();
    return 0;
}

7.把一個int數組的第一個元素和最后一個元素的值互換?

int[] a={2,3,4,5,7};
int temp=a[0];
a[0]=a[a.length-1];
a[a.length-1]=temp;

8. 從鍵盤輸入一個整數n,請輸入1,2,……,n的所有排列如n=3,則輸出為

1 2 3

1 3 2

2 1 3

2 3 1

void perm(int* data, int n, int curr){
if (curr==n-1){
for (int i = 0; i < n; ++i)
printf("%d", data[i]);
printf("\n");
}else{
for (int i = curr; i < n; ++i){
int t;
t = data[curr], data[curr] = data[i], data[i] = t;
perm(data, n, curr+1);
t = data[curr], data[curr] = data[i], data[i] = t;
     }
  }
}
int main(){
int array[128] = {0};
int n = 0, i = 0;

scanf("%d", &n);/*沒有數據合法性檢查*/
for (i = 0; i < n; ++i) 
array[i] = i+1;
perm(array, n, 0);
return 0;
}

9.輸入一個正整數,將其逆序輸出。例如,輸入12345,輸出54321?

void main(){
long n,m;
printf("輸入一個正整數");
scanf("%d",&n);
while(n!=0){ 
m=n%10;
n=n/10;
printf("%d",m);
    }
} 

10.利用條件運算符的嵌套來完成此題:學習成績>=90分的同學用A表示,60-89分之間的用B表示, 60分以下的用C表示。

void main(){
int grade;
printf("Inter grade:");
scanf("%d",&grade);
if(grade>=90&&grade<100)
printf("Grade is:A\n");
else if(grade>=60&&grade<=89)
printf("Grade is:B\n");
else if(grade<60&&grade>=0)
printf("Grade is:C\n");
else printf("error\n");

11.判斷素數

//判斷m是不是素數的方法:讓m被i(i由2變到k=sqrt(m))除
//如果m能被某一個i(2到k之間的整數)整除則m必然不是素數
void main(){
int m,i,k;
printf("please enter an integer number:");
scanf("%d",&m);
k=sqrt(m);
for(i=2;i<=k;i++)
if(m%i==0) break;
if(i>k)
printf("%d is a prime number.\n",m);
else printf("%d is not a prime number.\n",m);
}

12.編程求1+(1+2)+…+(1+2+…+n),n的值由鍵盤輸入。要求使用for語句實現

void main(){
int j,k,i,sum=0,n=1,m,a=0;
printf("輸入累加到幾:");
scanf("%d",&j);
for(i=1;i<=j;i++){
sum=sum+n;
n++;
for(m=1;m<=1;m++){
a=a+sum;
   }
 }
printf("該數為%d\n",a);
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,117評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,860評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,128評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,291評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,025評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,421評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,477評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,642評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,177評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,970評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,157評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,717評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,410評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,821評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,053評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,896評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,157評論 2 375

推薦閱讀更多精彩內容