剑指offer(二)java

    xiaoxiao2021-03-25  114

    1.输入一个链表,从尾到头打印链表每个节点的值。

    package test3;      import java.util.ArrayList;    class ListNode {       int val;       ListNode next = null;          ListNode(int val) {           this.val = val;       }   }   public class printFromTailtoHead {              public static ArrayList<Integer> printListFromTailToHead(ListNode listNode) {           ArrayList<Integer> a = new ArrayList<Integer>();           ListNode temp = listNode;           while(temp != null){               a.add(new Integer(temp.val));               temp = temp.next;           }           Integer b ;           for(int i=0; i<a.size()/2;i++){               b = a.get(i);               a.set(i, a.get(a.size()-i-1));               a.set(a.size()-i-1,b);           }           return a;       }       public static void main(String args[]){           ListNode a = new ListNode(1);           a.next = new ListNode(2);           ArrayList<Integer> b = printListFromTailToHead(a);           System.out.println(b.get(0)+"----"+b.get(1));       }      }   2. 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

    public class Solution {           public TreeNode reConstructBinaryTree(int [] pre,int [] in) {                return reConstructBinaryTree0(pre, 0, pre.length, in, 0, in.length);           }              public TreeNode reConstructBinaryTree0(int [] pre, int preStart, int preEnd, int [] in, int inStart, int inEnd) {           if (preStart >= preEnd) { // way out               return null;           }           int rootIndex = indexOf(in, inStart, inEnd, pre[preStart]);           TreeNode root = new TreeNode(pre[preStart]);           int leftPreStart = preStart + 1;           int leftPreEnd = leftPreStart + (rootIndex - inStart);           int leftInStart = inStart;           int leftInEnd = rootIndex;                   // 构建左子树           root.left = reConstructBinaryTree0(pre, leftPreStart, leftPreEnd, in, leftInStart, leftInEnd);                      int rightPreStart = leftPreEnd;           int rightPreEnd = preEnd;           int rightInStart = rootIndex + 1;           int rightInEnd = inEnd;                   // 构建右子树           root.right = reConstructBinaryTree0(pre, rightPreStart, rightPreEnd, in, rightInStart, rightInEnd);           return root;       }                  // 找下标       public int indexOf(int[] array, int start, int end, int value) {           for (int i = start; i < end; i++) {               if (array[i] == value) {                   return i;               }           }           return -1;       }   }   3. 用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。

    解法:有两个栈,栈1和栈2.当入栈的时候,我们将它全放进栈1中,当需要出栈的时候,我们将栈1出栈到栈2中,然后再将栈2依次出栈。出完栈之后,再把stack2中的数pop出push到stack1,接受下次的操作。所以入栈的时候,思路很简单,注意到要将int类型转为Integer类型,我们使用了new Integer(int);当需要出栈的时候,我们用API提供的方法while(stack1.isEmpty())来将所有栈1的元素压入栈2中,然后将栈2弹出就可以。这里又涉及到将Integer的类型转为int类型的方法Integer.intValue();

    import java.util.Stack;      public class Solution {       Stack<Integer> stack1 = new Stack<Integer>();       Stack<Integer> stack2 = new Stack<Integer>();              public void push(int node) {           stack1.push(new Integer(node));          }          public int pop() {           int pop;           while (!stack1.isEmpty()) {               stack2.push(stack1.pop());           }           pop=stack2.pop().intValue();           while(!stack2.isEmpty()){               stack1.push(stack2.pop());           }           return pop;       }   }   4. 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

    public static int minOfShiftedArray(int[] x){           if(x==null||x.length==0){               return -1;           }           int len=x.length;           int low=0;           int high=len-1;           if(x[low]<x[high]){//if the array is not shifted actually,e.g. {1,2,3,4,5}               return x[low];           }           int mid=0;           while(low<high){               mid=(low&high)+(low^high)/2;               if(mid==low){//if there are only two elements left                   return x[low]<=x[high]?x[low]:x[high];               }               if(x[mid]>=x[low]){                   low=mid;               }else{                   high=mid;               }           }           return x[mid];       }  

    转载请注明原文地址: https://ju.6miu.com/read-19802.html

    最新回复(0)