劍指offer面試題彙總 演算法和資料操作

2021-09-11 19:44:01 字數 3080 閱讀 6309

面試題11:旋轉陣列最小數字

面試題12:矩陣中的路徑

面試題13:機械人的運動範圍

解題思路

面試題14:剪繩子

面試題15:二進位制中1的個數

求斐波那契數列的第n項。

long long fibonacci(unsigned int n)

long long fibonacci(unsigned n)

; if(n<2) return result[n];

long long f1;

long long f2;

long long fn;

for(unsigned int i=2; i<=n; i++)

return fn;

}

青蛙跳台階

乙隻青蛙一次可以跳上1級台階,也可跳上2級台階。求青蛙跳上n級台階共多少種跳法

轉變為fabonacci的應用:第n階台階的跳法=第n-1階的跳法(+1階) + 第n-2階的跳法(+2階)

可以用21的小矩形橫著或豎著去覆蓋更大的矩形,請問用8個21的小矩形無重疊覆蓋乙個2*8的大矩形共有多少種方法

依然是斐波那契數列

查詢和排序

把乙個陣列最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。輸入乙個遞增排序的陣列的旋轉,輸出旋轉陣列的最小元素。

例如:為的乙個旋轉,該陣列的最小值為1

直接遍歷的話時間複雜度為o(n

)o(n)

o(n)

,選擇利用二分排序的方法

我的**:

void findmax(vectora,  int &res)

if(min>a[mid])

}res = min;

}

int min(int *numbers, int length)

int index1 = 0;

int index2 = length-1;

int indexmid = index1;

while(numbers[index1] >= numbers[index2])

indexmid = (index1 + index2)/2;

if(numbers[indexmid] >= numbers[index1])

else if(numbers[indexmid]<=numbers[index2])

} return numbers[indexmid];

}

請設計乙個函式,用來判斷在乙個矩陣中是否存在一條包含某字串所有字元的路徑。路徑可以從矩陣中的任意一格開始,每一步可以在矩陣中向左、右、上、下移動一格。如果一條路徑經過了矩陣的某一格,那麼該路徑不能再次經過該格。

路徑可以被看成乙個棧,第n個字元周圍沒有第n+1個字元時,回到n-1;

bool haspath(char *matrix, int rows. int cols, char *str)

bool *visited = new bool[rows * cols];

memset(visited, 0, rows*cols);

int pathlength = 0;

for(int row = 0; row=0 && row=0 && col地上有乙個m行n列的方格。乙個機械人從座標(0, 0)的格仔開始移動,它每次可以向左、右、上、下移動一格,但不能進入行座標和列座標的位數之和大於k的格仔。

例如,當k=18, 機械人能進入方格(35, 37),3+5+3+7=18。請問該機械人能夠到達多少個格仔?

移動判斷int movingcountcore(int threshold, int rows, int cols, int row, int col, bool* visited);

bool check(int threshold, int rows, int cols, int row, int col, bool* visited);

int getdigitsum(int number);

int movingcount(int threshold, int rows, int cols)

int movingcountcore(int threshold, int rows, int cols, int row,

int col, bool* visited)

return count;

}bool check(int threshold, int rows, int cols, int row, int col,

bool* visited)

int getdigitsum(int number)

return sum;

}

哭遼,兩個題沒了!

給你一根長度為n的繩子,請把繩子剪成m段,使得每段乘積最大

請實現乙個函式,輸入乙個整數,輸出該數二進位制表示中1的個數

我的笨辦法

int countone(int num)

return count;

}

哎呀,還得考慮符號位

右移也是除以2,並且右移的效率高很多。

先把n和1做與運算,判斷最低位是不是1。再把n左移一位,再與n做與運算,判斷n的次低位是不是1。

這樣每次判斷n的一位是不是1

int numberof1(int n)

return count;

}

上述方法32位n迴圈32次

把乙個整數減去1,再和原整數做與運算,會把該整數的最右邊的1變成0;

int numberof1(int n)

return count;

}

劍指Offer學習 所有面試題彙總

目錄第01 10題 劍指offer學習 面試題02 實現singleton 模式 七種實現方式 劍指offer學習 面試題03 二維陣列中的查詢 劍指offer學習 面試題04 替換空格 劍指offer學習 面試題05 從尾到頭列印鍊錶 劍指offer學習 面試題06 重建二叉樹 劍指offer學習...

劍指offer面試題7

面試題7 用兩個棧實現佇列 using namespace std template class cqueue 預備知識 佇列 佇列也是一種常見的資料結構 特點是先進先出 fifo 在stl中有stack和queue兩個容器 template class stack 成員函式 empty size ...

劍指offer面試題11

面試題1 數值的整數的次方 題目 實現函式double power double base,int exponent 求base的 exponent次方。不得使用庫函式,同時不需要考慮大數問題。思路 首先應該明確指數的可能取值 正整數,0,負整數 另外還需要考慮底數是0的情形。對於負整指數,我們可以...