<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    neverend的日志

    不記錄,終將被遺忘。 一萬年太久,只爭朝夕。 他們用數(shù)字構(gòu)建了整個世界。

      BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
      62 Posts :: 1 Stories :: 17 Comments :: 0 Trackbacks


    2.1求8位二進(jìn)制數(shù)中1的個數(shù)
    解法1:直觀法,每次除以2,計算余數(shù)為1的個數(shù) O(log2v)
    解法2:簡單位操作,每次與0x01做與運(yùn)算,再右移一位。O(log2v)
    解法3:使用位操作v & (v-1) , 每次可減少二進(jìn)制數(shù)字中的一個1。(若v & (v-1) == 0, 則v為2的方冪)
    解法4:空間換時間,利用題目中字長8位的破綻,建立一個窮舉數(shù)組。O(1)

    知識點(diǎn):位運(yùn)算的性質(zhì)
    附:數(shù)組有2n+1個數(shù),其中n個數(shù)成對出現(xiàn),找出非成對出現(xiàn)的那個數(shù)。
    數(shù)組所有元素做異或操作。

    2.2
    1.N!的末尾有多少個零
    2.N!二進(jìn)制表示中最低位1的位置

    1.解法:質(zhì)因數(shù)分解可知,0只有2*5可得,所以0的個數(shù)就是質(zhì)因數(shù)分解中2的個數(shù)與5的個數(shù)的最小值,實(shí)際上就是
    求5的個數(shù)Z。
    Z= [N/5] + [N/5^2] +[N/5^3]+ ……
    [N/5]表示不大于N的數(shù)中5的倍數(shù)貢獻(xiàn)一個5
    [N/5^2]表示不大于N的數(shù)中5^2再貢獻(xiàn)一個5/。

    2.解法:因為質(zhì)因數(shù)分解中只有2是偶數(shù),所以Z = [N/2] + [N/2^2] + [N/2^3] + …… +

    2.3尋找多數(shù)元素問題
    解法:減治:每次刪除兩個不同的ID,水王ID出現(xiàn)的次數(shù)仍舊會超過總數(shù)的一半。

    2.4從1到N的所有數(shù)中“1”出現(xiàn)的個數(shù)
    解法:尋找1出現(xiàn)的規(guī)律,比較復(fù)雜。

    2.5尋找N個整數(shù)中最大的K個數(shù)
    解法1:選擇排序,選出最大的K個數(shù)。 O(n*k)
     一點(diǎn)改進(jìn):部分堆排序,先建堆,再排出最大的k個數(shù)即可。O(n)+O(logn*k)
    解法2:分治,利用快速排序的劃分思路。O(n*log2k)
    解法3:二分搜索(與《編程珠璣》第二章問題A思路類似),有兩種劃分方式:
    1.設(shè)已知N個數(shù)中最小值Vmin,最大值Vmax,對區(qū)間[Vmin, Vmax]做二分即可。
    2.設(shè)N個整數(shù)是M位長的。從最高位開始,按bi位0、1二分。
    此解法適用于大數(shù)據(jù)量的處理,不過要多次讀寫若干個臨時文件。
    解法4:建一個最小堆存儲K個數(shù),堆頂為堆中最小值。
    對第k到N個數(shù),若A[i]大于堆頂H[0],令H[0]=A[i],再調(diào)用shift-down過程調(diào)整堆。
    此解法非常適合于N值很大的情況,復(fù)雜度為O(n * log2k)
    解法5:空間換時間,用count[Vmax]計算每個數(shù)字出現(xiàn)的次數(shù)。
    如果Vmax很大,將[0, Vmax]分成m個小塊,再分別討論即可。

    2.7最大公約數(shù)問題
     用位運(yùn)算求解
       位運(yùn)算問題:
       1.求一個整數(shù)的二進(jìn)制表示中1的個數(shù)
       2.逆轉(zhuǎn)一個整數(shù)的二進(jìn)制表示問題

    2.9斐波那契數(shù)列
    ·遞歸 效率最低
    ·迭代 O(n)
    ·矩陣分治法

    2.14子數(shù)組之和的最大值
    分治
    動態(tài)規(guī)劃

    2.15子矩陣之和的最大值
    固定一維,另一維轉(zhuǎn)化為子數(shù)組之和的最大值問題

    2.16求數(shù)組中最長遞增字符列的長度

    解法1:動態(tài)規(guī)劃

    假設(shè)array[]的前i個元素中,最長遞增子序列的長度為LIS[i],

    則,LIS[i + 1] = max{1, LIS[k]+1}, array[i+1] > array[k], for any k<=i

    int LIS(int[] array) {
    int[] LIS = new int[array.length];
    for (int i = 0 ; i < array.length; i++) {
        LIS[i] 
    = 1;
        
    for (int j = 0; j<i; j++) {
            
    if (array[i] > array[j] && LIS[j] + 1 >LIS[i])
                LIS[i] 
    = LIS[j] + ; 
        }

    }

     

    O(N^2)的時間復(fù)雜度

    解法2:

    MLIS[i]定義為前i個元素中,以array[i]為最大元素的最長遞增子序列的長度。

    可以證明,MLIS[i]的最大值也是最終的結(jié)果。

    MaxV[i]保存長度為i的遞增子序列最大元素的最小值。

    解法2的程序更新MaxV的部分應(yīng)該是有問題的,由此導(dǎo)致時間復(fù)雜度的分析錯誤,并且解法3也是錯誤的。


    2.17數(shù)組循環(huán)移位

    void rightshift(int *arr, int N, int k) {
        K 
    %= N;
        Reverse(arr, 
    0, N-k-1);
        Reverse(arr, N
    -k, N-1);
        Reverse(arr, 
    0, N-1);
    }

     

    數(shù)組問題思路:

    排序思路

    動態(tài)規(guī)劃

    看成一個數(shù)列或向量


    2.18數(shù)組分割


    3.1字符串移位包含的問題

    給定兩個字符串s1和s2,要求判定s2能否被s1做循環(huán)移位得到的字符串包含。例如:s1 = AABCD , s2 = CDAA,返回true. 給定s1 = ABCD 和 s2 = ACBD,返回false.

    解法1:模擬字符串移位的過程,判斷是否包含子串

    解法2:判斷s2是否為s1s1的子串即可。

    解法3:不申請空間,模擬判斷s2是否為s1s1子串的過程。

    思路:字符串可以抽象成向量來考慮。


    3.2電話號碼對應(yīng)英語單詞

    類似于求冪集問題

    解法1:迭代,用while循環(huán)模擬

    解法2:遞歸

     

    3.3計算字符串相似度
    遞歸求解

    int calStrDis(char[] strA, int pABegin, int pAEnd, 
                
    char[] strB, int pBBegin, int pBEnd) {
            
    if (pABegin > pAEnd) {
                
    if (pBBegin > pBEnd) {
                    
    return 0;
                } 
    else {
                    
    return pBEnd - pBBegin + 1;
                }
            }
            
            
    if (pBBegin > pBEnd) {
                
    if (pABegin > pAEnd) {
                    
    return 0;
                } 
    else {
                    
    return pAEnd - pABegin + 1;
                }
            }
            
            
    if (strA[pABegin] == strB[pBBegin]) {
                
    return calStrDis(strA, pABegin + 1, pAEnd, strB,
                        pBBegin 
    + 1, pBEnd);
            } 
    else {
                
    int t1 = calStrDis(strA, pABegin, pAEnd, strB, pBBegin + 1
                        pBEnd);
                
    int t2 = calStrDis(strA, pABegin + 1, pAEnd, strB, pBBegin ,
                        pBEnd);
                
    int t3 = calStrDis(strA, pABegin + 1, pAEnd, strB, pBBegin + 1 ,
                        pBEnd);
                
    return min(t1, t2, t3) + 1;
            }
        }
    遞歸優(yōu)化,如何存儲子問題的解?

    3.4從無頭鏈表中刪除節(jié)點(diǎn)
    這個問題很無恥

    3.5最短摘要生成
    有空再看

    3.6編程判斷兩個鏈表是否相交
    轉(zhuǎn)化成鏈表是否有環(huán)的問題

    3.7隊列中取最大值操作
    可分解為兩個子問題
    子問題1:設(shè)計一個堆棧,使入棧,出棧,取最大值的時間復(fù)雜度都是O(1)。
    思路:用空間換時間,加一個數(shù)組link2NextMaxItem[],link2NextMaxItem[i]存儲的是前i個元素中最大值的下標(biāo)。

    子問題2:用上述特性的兩個堆棧實(shí)現(xiàn)一個隊列
    堆棧A負(fù)責(zé)入隊,堆棧B負(fù)責(zé)出隊。當(dāng)堆棧B空的時候,將堆棧A中的數(shù)據(jù)全部彈出并壓入堆棧B

    3.8 求二叉樹結(jié)點(diǎn)之間的最大距離
    動態(tài)規(guī)劃實(shí)現(xiàn),還是不太懂。

    3.9重建二叉樹
    遞歸求解

    3.10分層遍歷二叉樹
    隊列遍歷二叉樹+變量標(biāo)記層次

    3.11程序改錯
    編寫正確的二分搜索程序
    C代碼:

    int BinSearch(SeqList * R, int n , KeyType K )//在有序表R[0..n-1]中進(jìn)行二分查找,成功時返回結(jié)點(diǎn)的位置,失敗時返回-1
    int low=0,high=n-1,mid; //置當(dāng)前查找區(qū)間上、下界的初值
      if(R[low].key==K)
      
    {
      
    return 0
     ;
      }

      
    while(low<=high)//當(dāng)前查找區(qū)間R[low..high]非空
      mid=low+((high-low)/2);//使用 (low + high) / 2 會有整數(shù)溢出的問題
      if(R[mid].key==K)
      
    {
      
    return mid; //查找成功返回

      }

      
    if(R[mid].key>K)
      high
    =mid-1//繼續(xù)在R[low..mid-1]中查找

      else
      low
    =mid+1; //繼續(xù)在R[mid+1..high]中查找
      }

      
    return -1; //當(dāng)low>high時表示查找區(qū)間為空,查找失敗
      }
     //BinSeareh


    Java代碼:

    public static int binarySearch(int[] srcArray, int des)
      
    {
      
    int low = 0
    ;
      
    int high = srcArray.length-1
    ;
      
    while(low <= high) 
    {
      
    int middle = (low + high)/2
    ;
      
    if(des == srcArray[middle]) 
    {
      
    return
     middle;
      }
    else if(des <srcArray[middle]) {
      high 
    = middle - 1
    ;
      }
    else {
      low 
    = middle + 1
    ;
      }

      }

      
    return -1;
      }


    4.8三角形測試用例
    測試用例的三種類型:
    正常輸入 覆蓋功能點(diǎn)
    非法輸入 值域錯誤 類型錯誤
    邊界值輸入 0 1 MAX MIN 

    posted on 2010-09-29 11:10 neverend 閱讀(1251) 評論(0)  編輯  收藏 所屬分類: 筆記數(shù)據(jù)結(jié)構(gòu)&算法

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲图片中文字幕| 亚洲欧美国产日韩av野草社区| 欧洲精品99毛片免费高清观看 | 亚洲精品不卡视频| 欧美大尺寸SUV免费| 四虎影视久久久免费观看| 亚洲精品午夜视频| 亚洲第一区精品日韩在线播放| 久久久99精品免费观看| 亚洲午夜成人精品无码色欲| 久久久久亚洲av毛片大| 国色精品卡一卡2卡3卡4卡免费| 曰批全过程免费视频免费看 | 成人免费无码H在线观看不卡| 亚洲沟沟美女亚洲沟沟| 亚洲精品456播放| 手机看黄av免费网址| 国产vA免费精品高清在线观看 | 99久久99久久免费精品小说| 亚洲国产午夜精品理论片在线播放| 亚洲无人区一区二区三区| 最近的中文字幕大全免费版| 免费萌白酱国产一区二区三区| 亚洲欧美日韩综合久久久| 亚洲日本va午夜中文字幕一区| 国产成人免费片在线观看| 99re热精品视频国产免费| 一级毛片免费视频网站| 亚洲色大成网站www尤物| 久久精品国产亚洲av四虎| 免费一级特黄特色大片在线| 美女视频黄的全免费视频 | 国产又大又长又粗又硬的免费视频 | 精品国产福利尤物免费| 亚洲精品无码久久久久久 | 色www永久免费| 搜日本一区二区三区免费高清视频 | 九九久久精品国产免费看小说| 亚洲中文无码永久免费| 亚洲电影免费观看| 久久精品国产亚洲夜色AV网站|