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)到通訊錄獲取用戶名稱(chēng)和手機(jī)號(hào)碼的實(shí)現(xiàn)思路
- Android ListView position詳解及實(shí)例代碼
- Android ListView ImageView實(shí)現(xiàn)單選按鈕實(shí)例
相關(guān)文章
Android開(kāi)發(fā)筆記之:對(duì)實(shí)踐TDD的一些建議說(shuō)明
本篇文章是對(duì)Android中實(shí)踐TDD的一些建議進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
Android逆向入門(mén)之常見(jiàn)Davlik字節(jié)碼解析
Dalvik是Google公司自己設(shè)計(jì)用于Android平臺(tái)的虛擬機(jī)。Dalvik虛擬機(jī)是Google等廠商合作開(kāi)發(fā)的Android移動(dòng)設(shè)備平臺(tái)的核心組成部分之一,本篇文章我們來(lái)詳細(xì)解釋常見(jiàn)Davlik字節(jié)碼2021-11-11
Android 屬性動(dòng)畫(huà)ValueAnimator與插值器詳解
這篇文章主要介紹了Android 屬性動(dòng)畫(huà)ValueAnimator與插值器詳解的相關(guān)資料,需要的朋友可以參考下2017-05-05
kotlin中EditText賦值Type mismatch方式
這篇文章主要介紹了kotlin中EditText賦值Type mismatch方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03
Studio 編譯報(bào)錯(cuò):compileSdkVersion ''android-24'' requires JDK 1.
今天小編就為大家分享一篇關(guān)于Studio編譯報(bào)錯(cuò):compileSdkVersion 'android-24' requires JDK 1.8 or later to compile.的解決辦法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-10-10
Android RecyclerView布局就這么簡(jiǎn)單
Android RecyclerView布局就這么簡(jiǎn)單!RecyclerView比ListView更靈活,更強(qiáng)大,作為一個(gè)android開(kāi)發(fā)者如果還不知道如何使用android5.X的RecyclerView未免有點(diǎn)說(shuō)不過(guò)去了,本文就為大家講解Android RecyclerView布局,需要的朋友可以參考下2016-04-04
詳解Android?Flutter如何使用相機(jī)實(shí)現(xiàn)拍攝照片
在app中使用相機(jī)肯定是再平常不過(guò)的一項(xiàng)事情了,相機(jī)肯定涉及到了底層原生代碼的調(diào)用,那么在flutter中如何快速簡(jiǎn)單的使用上相機(jī)的功能呢?一起來(lái)看看吧2023-04-04
Android用戶注冊(cè)界面簡(jiǎn)單設(shè)計(jì)
這篇文章主要為大家分享了Android用戶注冊(cè)界面簡(jiǎn)單設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10
ShareSDK造成App崩潰的一個(gè)BUG原因分析以及Fix方法
這篇文章主要介紹了ShareSDK造成App崩潰的一個(gè)BUG原因分析以及Fix方法,使用的是Cocos2d-x專(zhuān)用ShareSDK組件,需要的朋友可以參考下2014-04-04

