Android中關(guān)于遞歸和二分法的算法實(shí)例代碼
// 1. 實(shí)現(xiàn)一個(gè)函數(shù),在一個(gè)有序整型數(shù)組中二分查找出指定的值,找到則返回該值的位置,找不到返回 -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. 實(shí)現(xiàn)一個(gè)函數(shù),在一個(gè)有序整型數(shù)組中二分查找出指定的值,找到則返回該值的位置,找不到返回 -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. 實(shí)現(xiàn)一個(gè)函數(shù),在一個(gè)有序整型數(shù)組中二分查找出指定的值,找到則返回該值的位置,找不到返回 -1。 // array 升虛數(shù)組 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. 寫(xiě)一個(gè)函數(shù)將一個(gè)數(shù)組轉(zhuǎn)化為一個(gè)鏈表。 // 要求:不要使用庫(kù)函數(shù),(如 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; } // 給鏈表尾部添加一個(gè)節(jié)點(diǎn) public Node addNode(Node end, int data){ Node node = new Node(); node.data = data; end.next = node; return node; } // 3. 有兩個(gè)數(shù)組,[1,3,4,5,7,9] 和 [2,3,4,5,6,8],用上面的函數(shù)生成兩個(gè)鏈表 linkA 和 // linkB,再將這兩個(gè)鏈表合并成一個(gè)鏈表,結(jié)果為[1,2,3,4,5,6,7,8,9]. // 要求:不要生成第三個(gè)鏈表,不要生成新的節(jié)點(diǎn)。 // 3.1 使用遞歸方式實(shí)現(xiàn) // 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; } // 實(shí)現(xiàn)遞歸 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 使用循環(huán)方式實(shí)現(xiàn) // 循環(huán)實(shí)現(xiàn) public Node comb(int[] arrayA, int[] arrayB){ // 轉(zhuǎn)換鏈表 Node linkA = convert(arrayA); Node linkB = convert(arrayB); // 獲取頭節(jié)點(diǎn) 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; // 依次將較小的節(jié)點(diǎn)加到鏈表尾部 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; } } // 如果其中一個(gè)鏈表為空,將另外一個(gè)鏈表直接添加到合成鏈表尾部 if(headA == null){ end.next = headB; }else if(headB == null){ end.next = headA; } return head; }
以上所述是小編給大家介紹的Android中關(guān)于遞歸和二分法的算法實(shí)例代碼,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)歡迎給我留言,小編會(huì)及時(shí)回復(fù)大家的,在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- Android 修改系統(tǒng)關(guān)機(jī)動(dòng)畫(huà)的實(shí)現(xiàn)
- Android仿斗魚(yú)直播的彈幕效果
- Android中轉(zhuǎn)場(chǎng)動(dòng)畫(huà)的實(shí)現(xiàn)與兼容性處理
- Android 矩陣ColorMatrix
- Android跳轉(zhuǎn)到通訊錄獲取用戶(hù)名稱(chēng)和手機(jī)號(hào)碼的實(shí)現(xiàn)思路
- Android ListView position詳解及實(shí)例代碼
- Android ListView ImageView實(shí)現(xiàn)單選按鈕實(shí)例
相關(guān)文章
Android仿微信和QQ多圖合并框架(類(lèi)似群頭像)的實(shí)現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于Android仿微信和QQ多圖合并框架的相關(guān)資料,其實(shí)就是我們平時(shí)所見(jiàn)的群聊頭像,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)各位Android開(kāi)發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12Android自定義實(shí)現(xiàn)循環(huán)滾輪控件WheelView
滾輪布局WheelView大家經(jīng)常使用,比如在選擇生日的時(shí)候,風(fēng)格類(lèi)似系統(tǒng)提供的DatePickerDialog,這篇文章主要為大家詳細(xì)介紹了Android自定義實(shí)現(xiàn)循環(huán)滾輪控件WheelView,感興趣的小伙伴們可以參考一下2016-07-07SimpleCommand實(shí)現(xiàn)上傳文件或視頻功能(四)
這篇文章主要介紹了SimpleCommand實(shí)現(xiàn)上傳文件或視頻功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10Android實(shí)現(xiàn)用代碼簡(jiǎn)單安裝和卸載APK的方法
這篇文章主要介紹了Android實(shí)現(xiàn)用代碼簡(jiǎn)單安裝和卸載APK的方法,涉及Android針對(duì)APK文件及package的相關(guān)操作技巧,需要的朋友可以參考下2016-08-08Android UI動(dòng)態(tài)設(shè)置帶有Stroke漸變色背景Drawable
這篇文章主要為大家介紹了Android UI動(dòng)態(tài)設(shè)置帶有Stroke漸變色背景Drawable,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01Android進(jìn)程?;钪嵘M(jìn)程優(yōu)先級(jí)
這篇文章主要介紹了Android進(jìn)程?;钪嵘M(jìn)程優(yōu)先級(jí),對(duì)提升優(yōu)先級(jí)感興趣的同學(xué)可以參考下2021-04-04Android 自定義彈出菜單和對(duì)話(huà)框功能實(shí)例代碼
Android 開(kāi)發(fā)當(dāng)中,可能會(huì)存在許多自定義布局的需求,比如自定義彈出菜單(popupWindow),以及自定義對(duì)話(huà)框(Dialog)。下面通過(guò)本文給大家介紹Android 自定義彈出菜單和對(duì)話(huà)框功能實(shí)例代碼,感興趣的朋友一起看看吧2017-08-08Android基于google Zxing實(shí)現(xiàn)二維碼的生成
這篇文章主要介紹了Android基于google Zxing實(shí)現(xiàn)二維碼的生成的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-06-06Android實(shí)現(xiàn)用文字生成圖片的示例代碼
本篇文章主要介紹了Android實(shí)現(xiàn)用文字生成圖片的示例代碼,這里整理了詳細(xì)的代碼,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-08-08