// 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; }
以上所述是小编给大家介绍的Android中关于递归和二分法的算法实例代码,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的,在此也非常感谢大家对小牛知识库网站的支持!
我对这个代码有一些问题 问题1:终止情况究竟如何运作?s.length如何等于0? 问题2:为什么代码需要具有“firstChar”才能反转字符串?为什么当逆转字符串接受0的子字符串而不必添加第一个字符时,代码不起作用?
本文向大家介绍java 二分法算法的实例,包括了java 二分法算法的实例的使用技巧和注意事项,需要的朋友参考一下 java 二分法算法的实例 1、前提:二分查找的前提是需要查找的数组必须是已排序的,我们这里的实现默认为升序 2、原理:将数组分为三部分,依次是中值(所谓的中值就是数组中间位置的那个值)前,中值,中值后;将要查找的值和数组的中值进行比较,若小于中值则在中值前面找,若大于中值则在中值后
我正在处理一个递归二分法/算法。我已经把我的递归放在else/else if语句中,不知道我是否错了。它也返回正确的根,而没有递归,但主要问题是用递归。
本文向大家介绍java递归算法的实例详解,包括了java递归算法的实例详解的使用技巧和注意事项,需要的朋友参考一下 递归三要素: 1、明确递归终止条件; 2、给出递归终止时的处理办法; 3、提取重复的逻辑,缩小问题规模。 1、1+2+3+…+n 2、1 * 2 * 3 * … * n 3、斐波那契数列 前两项均为1,第三项开始,每一项都等于前两项之和。即:1,1,2,3,5,8,… 4、二叉树的遍
(这不是一个复制品)我们有一个2D迷宫,四面都有X,还有内部的方块<迷宫的所有这些特征都存储在2D数组中。程序必须找到从开始“S”到目标“G”的路径。为此,将使用一个名为“solve(int row,int col)”的布尔方法,并使用“S”的行和列索引初始化该方法。算法必须是递归的。如果它能够找到通往“G”的路径,那么它应该返回true,否则返回false。下面是我试图解决这个问题的方法,它显示
本文向大家介绍Java实现的质因数分解操作示例【基于递归算法】,包括了Java实现的质因数分解操作示例【基于递归算法】的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java实现的质因数分解操作。分享给大家供大家参考,具体如下: 这里演示java通过递归实现质因数分解,代码如下: 运行结果: PS:这里提供一款功能相似的在线工具供大家参考:在线分解质因数计算器工具 http://tools