Android 演算法 關於遞歸和二分法的小演算法

来源:http://www.cnblogs.com/lipeineng/archive/2016/10/14/5960470.html
-Advertisement-
Play Games

// 1. 實現一個函數,在一個有序整型數組中二分查找出指定的值,找到則返回該值的位置,找不到返回 -1。 package demo; public class Mytest { public static void main(String[] args) { int[] arr={1,2,5,9, ...


 // 1. 實現一個函數,在一個有序整型數組中二分查找出指定的值,找到則返回該值的位置,找不到返回 -1。
package demo;

public class Mytest {
    public static void main(String[] args) {
        int[] arr={1,2,5,9,11,45};
        int index=findIndext(arr,0,arr.length-1,12);
        System.out.println("index="+index);
    }
    // 1. 實現一個函數,在一個有序整型數組中二分查找出指定的值,找到則返回該值的位置,找不到返回 -1。
    public static int findIndext(int[] arr,int left,int right,int abc){
        if(arr==null||arr.length==0){
            return -1;
        }
        if(left==right){
            if(arr[left]!=abc){
                return -1;
            }
        }
        int mid=left+(right-left)/2;//3//4
        if(arr[mid]>abc){//
            right=mid-1;
            return findIndext(arr,left,right,abc);
        }else if(arr[mid]<abc){//5<45//9<45/11<45
            left=mid+1;
            return findIndext(arr,left,right,abc);//2,5//3,5//4.5
        }else{
            return mid;
        }
    }
    
    
    
    
}

 



 
/ 1. 實現一個函數,在一個有序整型數組中二分查找出指定的值,找到則返回該值的位置,找不到返回 -1// array 升虛數組
public int find(int[] array, int n){
    if(array == null){
        return -1;
    }
    
    int len = array.length;
    if(n < array[0] || n > array[len-1]){
        return -1;
    }
    
    int left     = 0;
    int right    = len -1;
    while(left < right){
        int mid    = left + (right - left) / 2;
        
        if(array[mid] == n){
            return mid;
        }else if(array[mid] < n){
            left    = mid + 1;
        }else{
            right    = mid - 1;
        }
    }
    
    if (array[left] == n){
        return left;
    } else {
        return right;
    }
}







// 2. 寫一個函數將一個數組轉化為一個鏈表。
// 要求:不要使用庫函數,(如 List 等)

public static class Node{
    Node next;
    int data;
}

// 返回鏈表頭
public Node convert(int[] array){
    if(array == null || array.length == 0){
        return null;
    }
    
    Node head    = new Node();
    head.data     = array[0];
    int len      = array.length;
    
    Node end     = head;
    for(int i=1; i< len ; i++){
        end = addNode(end, array[i]);
    }
    
    return head;
}

// 給鏈表尾部添加一個節點
public Node addNode(Node end, int data){
    Node node    = new Node();
    node.data     = data;
    end.next     = node;
    return node;
}






// 3. 有兩個數組,[1,3,4,5,7,9] 和 [2,3,4,5,6,8],用上面的函數生成兩個鏈表 linkA 和
// linkB,再將這兩個鏈表合併成一個鏈表,結果為[1,2,3,4,5,6,7,8,9].
// 要求:不要生成第三個鏈表,不要生成新的節點。
// 3.1 使用遞歸方式實現

// 
public Node comb(int[] arrayA, int[] arrayB){
    Node linkA    = convert(arrayA);
    Node linkB    = convert(arrayB);
    Node head;
    if(linkA.data == linkB.data){
        head    = linkA;
        linkA   = linkA.next;
        linkB   = linkB.next;
        head.next = null;
    }else if (linkA.data < linkB.data){
        head    = linkA;
        linkA   = linkA.next;
        head.next = null;
    }else {
        head    = linkB;
        linkB   = linkB.next;
        head.next = null;
    }
    
    Node end    = head;
    comb(end, headA, headB);
    
    return head;
}

// 實現遞歸
public void comb(Node end, Node headA, Node headB){
    if(headA == null && headB == null){
        return;
    }else if(headA == null){
        end.next = headB;
        return;
    }else if(headB == null){
        end.next = headA;
        return;
    }
    
    if(headA.data < headB.data){
        end.next = headA;
        headA    = headA.next;
        end      = end.next;
        end.next = null;
        comb(end, headA, headB);
    }else if(headA.data == headB.data){
        end.next = headA;
        headA    = headA.next;
        headB    = headB.next;
        end      = end.next;
        end.next = null;
        comb(end, headA, headB);
    }else {
        end.next = headB;
        headB    = headB.next;
        end      = end.next;
        end.next = null;
        comb(end, headA, headB);
    }
}










// 3.2 使用迴圈方式實現

// 迴圈實現
public Node comb(int[] arrayA, int[] arrayB){
    // 轉換鏈表
    Node linkA    = convert(arrayA);
    Node linkB    = convert(arrayB);
    
    // 獲取頭節點
    Node head;
    if(linkA.data == linkB.data){
        head    = linkA;
        linkA   = linkA.next;
        linkB   = linkB.next;
        head.next = null;
    }else if (linkA.data < linkB.data){
        head    = linkA;
        linkA   = linkA.next;
        head.next = null;
    }else {
        head    = linkB;
        linkB   = linkB.next;
        head.next = null;
    }
    
    Node end    = head;
    // 依次將較小的節點加到鏈表尾部
    while(headA != null && headB != null){
        if(headA.data < headB.data){
            end.next = headA;
            headA    = headA.next;
            end      = end.next;
            end.next = null;
        
        }else if(headA.data == headB.data){
            end.next = headA;
            headA    = headA.next;
            headB    = headB.next;
            end      = end.next;
            end.next = null;
        
        }else {
            end.next = headB;
            headB    = headB.next;
            end      = end.next;
            end.next = null;
        
        }
    }
    
    // 如果其中一個鏈表為空,將另外一個鏈表直接添加到合成鏈表尾部
    if(headA == null){
        end.next = headB;
    }else if(headB == null){
        end.next = headA;
    }
    
    
    return head;
}

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 對於一個從後臺轉到前端的web開發者來說,最大的麻煩就是寫CSS,瞭解CSS的人都知道,它可以開髮網頁樣式,但是沒法用它編程,感覺耦合性相當的高,如果想要方便以後維護,只能逐句修改甚至重寫相當一部分的CSS。隨著後臺人員大量的涌入前端這個行業,CSS又煥發了新的春天,人們開始為CSS加入編程元素,也 ...
  • 讓前端程式更具可維護性,是一個老生常談的問題,大多數時候我們都關註於應用層面的代碼可維護性,如:OO、模塊化、MVC,編碼規範、可擴展和復用性,但這都是屬於設計層面需要考慮的事情,可維護性還應包含另一個方面,也是很多coder容易忽略的地方,就是將自己寫的程式以文檔的形式沉澱起來,對自己工作有一個結 ...
  • Android系統下的基本數據存儲形式,文件存儲、sp存儲、資料庫存儲、網路存儲、Content Provider記憶體提供者 ...
  • 一.使用HttpURLConnection提交數據 "get"請求 代碼: String path = "http://地址?數據1名字=" + URLEncoder.encode(數據1,"utf-8") + "&數據2名字=" +URLEncoder.encode(數據2,"utf-8"); U ...
  • 記憶體錯誤crash現場: Thread堆棧: 有可能是訪問被釋放對象造成,根據現場並不能找到具體哪個對象出現記憶體錯誤。 1.開啟僵屍對象調試 Edit Scheme->Debug->Diagnostics->Enable Zombie Objects 2.閃退後查看控制台,看輸出應該是某個Butto ...
  • 1、Handler 機制 Android 中主線程也叫 UI 線程,那麼從名字上我們也知道主線程主要是用來創建、更新 UI 的,而其他耗時操作,比如網路訪問,或者文件處理,多媒體處理等都需要在子線程中操作,之所以在子線程中操作是為了保證 UI 的流暢程度,手機顯示的刷新頻率是 60Hz,也就是一秒鐘 ...
  • 試試這個,能解決國內訪問Google伺服器的困難啟動 Android SDK Manager ,打開主界面,依次選擇「Tools」、「Options...」,彈出『Android SDK Manager - Settings』視窗;在『Android SDK Manager - Settings』窗 ...
  • 在項目中日期的顯示經常會當天的顯示時分,當月的顯示日時和分,以此類推,難免會涉及到日期的比較,下麵介紹一下日期比較的兩種方法 比較日期有兩種方法 一種是通過系統的NSCalendar類實現 NSString * date = @"2016-10-12 13:12:12"; //創建日期格式 NSDa ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...