Time of Update: 2018-12-05
1. 簡述 對於一個由N個正數組成的數組,需要比較多少次才能把最大值和最小值找出來?2. 思路 1) 就是遍曆一遍,分別統計最大值和最小值,2*N。 2) 每次遍曆兩個數字,比較一下這兩個數字,大的數字更新最大值,小的數字更新最小值,一共是N/2次,每次比較3次,一共就是3*N/2次比較。
Time of Update: 2018-12-05
1. 簡述 給定一棵二叉樹,假定每個節點都用唯一的字元表示,具體結構如下:struct NODE { NODE* pLeft; NODE* pRight; char chValue;}; 假設已經有了前序走訪和中序遍曆結果,希望通過一個演算法重建這棵樹。
Time of Update: 2018-12-05
1. 題目 給定一整數序列A1, A2,... An (可能有負數),求A1~An的一個子序列Ai~Aj,使得Ai到Aj的和最大。例如: 整數序列-2, 11, -4, 13, -5, 2, -5, -3, 12, -9的最大子序列的和為20。 編程之美上的一道題,也是常考題目之一。2. 解答 屬於基礎動態規劃。遞推公式如下: 假設序列為:a[0],a[1],...,a[n-1], 定義兩個新的序列:p[0],p[1],...,p[n-1],和q[0],q[1],...,
Time of Update: 2018-12-05
1. 簡述 對一個位元組(8bit)的無符號整型變數,求其二進位表示中“1”的個數,要求演算法的執行效率儘可能的高。2. 思路 我對這道題沒有什麼新的發現,也就是再說一遍編程之美上面的解答思路。第一個思路就是一個位一個位的判斷,8位的數字,就是8次。第二個思路就是每次消減數字二進位中的最後一個1,直到數字變為0為止,這個方法僅與數位二進位中的1的個數有關,因此比第一個思路的複雜度更好一點,每次消減最後一個1的方法為num = num & (num-1)。3.
Time of Update: 2018-12-05
1. 簡述1.1 一般方法 計數排序的排序對象一般是整數。 假設待排序數組為 int array[], 數組長度為n。 第一步:開闢臨時數組,int tmp[],數組長度為n。int count,數組長度為10。 第二步:遍曆數組,得到最大數值的位元d,即後面需要d次排序。 第三步:根據個位進行排序,根據十位進行排序,···,根據d位進行排序。 對於根據i位進行排序,其中1<=i<=d
Time of Update: 2018-12-05
這題只不過把王曉東書上求最小連乘次數改為了求最大連乘次數,方法還是DP狀態轉移方程:m[i][j] = Max(m[i][k] + m[k+1][j] + p[i-1]*p[k]*p[j]) Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->#include <stdio.h>#define N 11int m[N][N]
Time of Update: 2018-12-05
看到這題,第一時間就聯想到了求二叉樹深度(通過分別求左右子樹的深度,然後合并(取最大值加1)從而得到了根節點的深度(其實就是分治思想))代碼如下:Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->int Depth(Node *p){int l_d , r_d;if(p == NULL) {return 0; } l_d =
Time of Update: 2018-12-05
1.輸出二叉樹某一層結點(從左至右)把輸出二叉樹第K層結點轉換成:分別輸出"以該二叉樹根結點的左右子樹為根的兩棵子樹"中第K-1層結點。Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->void PrintNodeAtLevel(Node *root , int level){if(!root || level < 0)return
Time of Update: 2018-12-05
1. 函數原型(c++ reference) void * memcpy ( void * destination, const void * source, size_t num ); 不能解決某些覆蓋問題。 char * strcpy ( char * destination, const char * source ); 不能解決某些覆蓋問題,根據'\0'表示字串複製終止。 void * memmove ( void * destination, const void
Time of Update: 2018-12-05
整數劃分問題和正整數連續劃分問題:http://www.cnblogs.com/nokiaguy/archive/2008/05/11/1192308.html講的很細緻放蘋果問題:把m個蘋果放到n個盤子裡,允許有空,有多少种放法http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=showdetail&id=2679 遞迴方程:f(m,n) = f(m,n-1) + f(m-n,n) //每次分有兩種分法f(m,n-1):
Time of Update: 2018-12-05
1. 簡述 有一個無序、元素個數為2n的正整數數組,要求:如何能把這個數組分割為元素個數為n的兩個數組,並使兩個子數組的和最接近?例如有如下數組,1,5,7,8,9,6,3,11,20,17。應該分割為1,3,11,8,20和5,7,9,6,17。2. 思路 方法一,暴力搜尋,遍曆每種分組方法,一共C(2N, N)種組合,複雜度是(2N!/N!),複雜度過高。
Time of Update: 2018-12-05
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1944這道題是練習遞迴並深刻理解二叉樹遍曆的好題目(編程之美上也有) Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->#include <stdio.h>#include
Time of Update: 2018-12-05
1. 簡述 假設待排序數組為 int array[], 數組長度為n。 第1趟在array[0]-array[n-1]範圍內,從後向前依次比較,把較小交換到前面,最終最小的元素會站在array[0]裡面。 第2趟在array[1]-array[n-1]範圍內,··· ,最終第二小的元素會站在array[1]裡面。 ... 第n-1趟,在array[n-2]-array[n-1]範圍內,··· , 最終第n-1小的元素會站在array[n-2]裡面。
Time of Update: 2018-12-05
1. 簡述 給定兩個字串s1和s2,要求判斷s2是否能夠被s1做迴圈移位得到的字串包含。例如,給定s1=AABCD和s2=CDAA,返回true;給定s1=ABCD,s2=ACBD,返回false。2. 思路 將問題轉化為:判斷s1s1中是否包含s2子串。即對於s1=AABCD和s2=CDAA,判斷AABCDAABCD中是否存在AA。 使用KMP匹配就行,對於s1s1也不用特地去開闢空間,假設s1的字串指標為str,長度為len_str,只需len_str +=
Time of Update: 2018-12-05
1.刪除指定字元這是《The C programming language》中的一個例子,寫的很巧妙(比我自己當時想的好多了),原地刪除,沒有多用額外的儲存空間。Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->void squeeze(char *s , int c){int i , j;for(i = j = 0 ; s[i] ; i++)
Time of Update: 2018-12-05
1. 題目 #include<iostream>using namespace std;class S {};class A:S {virtual void fun() { ; }};class B:A {virtual void fun() { ; }};class C:B {virtual void fun() { ; }};class M {virtual void fun() {}};class N {virtual void fun() {}};
Time of Update: 2018-12-05
1. 簡述 假設待排序數組為 int array[], 數組長度為n。 第1趟,認為array[0]-array[0]已經排序,把array[1]插入到合適的位置。 第2趟,認為array[0]-array[1]已經排序,把array[2]插入到合適的位置。 ··· 第n-1趟,認為array[0]-array[n-2]已經排序,把array[n-1]插入到合適的位置。2. 複雜度
Time of Update: 2018-12-05
這幾天在網上看了很多關於線段樹和樹狀數組的資料,感覺是很重要的資料結構,有必要邊學邊做下記錄。1.線段樹凡是關於線段樹的資料,我想都有這麼一張圖,的確,它給了人最初的感性認識,其次這幅圖在以後分析問題時也很有協助: 線段樹的基本操作(由於線段樹是一棵完全二叉樹,且每條線段以類似“二分”的方法處理,因此時間複雜為O(logN)):Code highlighting produced by Actipro CodeHighlighter
Time of Update: 2018-12-05
1. 簡述 1) 給定一個整數N,那麼N的階乘N!末尾有多少個0呢?例如:N=10,N!=3 628 800,N!的末尾有兩個0。 2) 求N!的二進位表示中最低位1的位置。 2.
Time of Update: 2018-12-05
1. 簡述 楊氏矩陣中,每行元素是遞增的,每列元素也是遞增的。即a[i][j]<a[i+1][j]且a[i][j]<a[i][j+1]。要在這樣的矩陣中尋找某個數值元素的位置,複雜度可以達到O(M+N),其中M為矩陣行長度,N為矩陣列長度。2. 原理 從矩陣的左下角或者矩陣的右上方處開始遞迴運行,以左下角為例,value為要尋找的值,(i,j)為當前矩陣中的位置,初始為(M-1, 0)。 如果超過了矩陣範圍則說明不存在這樣的元素,返回-1,-1。