剑指offer

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

[java] view plain copy
  1. import java.util.*;  
  2. public class Solution {  
  3.     public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {  
  4.           
  5.         Stack<Integer>stack=new Stack<Integer>();  
  6.         ArrayList<Integer>arrayList=new ArrayList<Integer>();  
  7.          if(listNode==null)  
  8.             return arrayList;  
  9.         while(listNode!=null)  
  10.             {  
  11.             stack.add(listNode.val);  
  12.             listNode=listNode.next;  
  13.             }  
  14.         while(!stack.empty()){  
  15.             arrayList.add(stack.pop());  
  16.         }  
  17.         return arrayList;  
  18.     }  
  19. }  

------------------------------------------------------------------------------------------------------------------------------------------

104.输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

[java] view plain copy
  1. import java.util.ArrayList;  
  2. public class Solution {  
  3.      public TreeNode reConstructBinaryTree(int [] pre,int [] in) {  
  4.     TreeNode root=reConstructBinaryTree(pre,0,pre.length-1,in,0,in.length-1);  
  5.     return root;       
  6.         }  
  7. private TreeNode reConstructBinaryTree(int[] pre,int preStart,int preEnd,int[] in,int inStart,int inEnd)  
  8.         {  
  9.     if(preStart>preEnd||inStart>inEnd)  
  10.         return null;  
  11.             TreeNode root=new TreeNode(pre[preStart]);  
  12.             for(int i=inStart;i<=inEnd;i++)  
  13.                 if(in[i]==pre[preStart])  
  14.             {  
  15.                 root.left=reConstructBinaryTree(pre,preStart+1,preStart+i-inStart,in,inStart,i-1);  
  16.                 root.right=reConstructBinaryTree(pre,preStart+i-inStart+1,preEnd,in,i+1,inEnd);  
  17.             }  
  18.               
  19.             return root;          
  20.         }  
  21. }  

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

111.输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

如果一个整数不为0,那么这个整数至少有一位是1。如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,

原来在1后面的所有的0都会变成1(如果最右边的1后面还有0的话)。其余所有位将不会受到影响。
举个例子:一个二进制数1100,从右边数起第三位是处于最右边的一个1。减去1后,第三位变成0,它后面的两位0变成了1,

而前面的1保持不变,因此得到的结果是1011.我们发现减1的结果是把最右边的一个1开始的所有位都取反了。

这个时候如果我们再把原来的整数和减去1之后的结果做与运算,从原来整数最右边一个1那一位开始所有位都会变成0。

如1100&1011=1000.也就是说,把一个整数减去1,再和原整数做与运算,会把该整数最右边一个1变成0.那么一个整数的二进制有多少个1,

就可以进行多少次这样的操作。

[java] view plain copy
  1. public class Solution {  
  2.     public int NumberOf1(int n) {  
  3.         int count = 0;  
  4.         while(n!= 0){  
  5.             count++;  
  6.             n = n & (n - 1);  
  7.          }  
  8.         return count;  
  9.     }  
  10. }  

-------------------------------------------------------------------------------------------------------------------------------------------

114输入一个链表,输出该链表中倒数第k个结点。

[java] view plain copy
  1. public class Solution {  
  2.     public ListNode FindKthToTail(ListNode head,int k) {  
  3.  if(head==null||k<=0)  
  4.              return null;  
  5.     ListNode pre=head;  
  6.     ListNode last=head;  
  7.     for(int i=1;i<k;i++)  
  8.     {  
  9.       if(pre.next!=null)  
  10.       pre=pre.next;  
  11.       else  
  12.     return null;  
  13.     }  
  14.    while(pre.next!=null)      
  15.     {  
  16.     pre=pre.next;  
  17.     last=last.next;  
  18.     }  
  19.    return last;        
  20.     }  
  21. }  

--------------------------------------------------------------------------------------------------------------------------------------------------------

115输入一个链表,反转链表后,输出链表的所有元素

[java] view plain copy
  1. public class Solution {  
  2.     public ListNode ReverseList(ListNode head) {  
  3.        if (head == null)  
  4.        return head;  
  5.     ListNode dummy = new ListNode(-1);  
  6.     dummy.next = head;  
  7.    ListNode prev = dummy.next;  
  8.    ListNode pCur = prev.next;  
  9.    while (pCur != null) {  
  10.    prev.next = pCur.next;  
  11.    pCur.next = dummy.next;  
  12.    dummy.next = pCur;  
  13.    pCur = prev.next;  
  14.           }  
  15.   return dummy.next;  
  16.     }  
  17. }  

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

116输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

[java] view plain copy
  1. public class Solution {  
  2. public ListNode Merge(ListNode list1,ListNode list2) {  
  3.         if(list1==null)  
  4.             return list2;  
  5.         if(list2==null)  
  6.             return list1;  
  7.         ListNode res=null;  
  8.         if(list1.val<list2.val)  
  9.         {  
  10.             res=list1;  
  11.             res.next=Merge( list1.next,list2);  
  12.         }  
  13.         else  
  14.         {  
  15.             res=list2;  
  16.             res.next=Merge( list2.next,list1);  
  17.         }  
  18.         return res;  
  19.     }  
  20. }  

----------------------------------------------------------------------------------------------------------------------------------------------------------------------

117.输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

[java] view plain copy
  1. public class Solution {  
  2. public boolean HasSubtree(TreeNode root1,TreeNode root2) {  
  3.         if(root1==null||root2==null)  
  4.             return false;  
  5.         boolean flag=false;  
  6.         if(root1.val==root2.val)  
  7.             flag=isSubtree(root1,root2);  
  8.         if(!flag)  
  9.         {  
  10.             flag=HasSubtree(root1.left,root2);  
  11.               if(!flag)  
  12.                   flag=HasSubtree(root1.right,root2);  
  13.         }  
  14.             return flag;    
  15.     }  
  16. public boolean isSubtree(TreeNode root1,TreeNode root2)  
  17. {  
  18.     if(root2==null)  
  19.         return true;  
  20.     if(root1==null&&root2!=null)  
  21.         return false;  
  22.     if(root1.val==root2.val)  
  23.     return isSubtree(root1.left,root2.left)&&isSubtree(root1.right,root2.right);  
  24.     else  
  25.         return false;  
  26. }  
  27. }  

------------------------------------------------------------------------------------------------------------------------------

118

操作给定的二叉树,将其变换为源二叉树的镜像。
输入描述:

二叉树的镜像定义:源二叉树
            8
           /  \
          6   10
         / \     / \
        5  7 9 11
        镜像二叉树
            8
           /  \
          10   6
         / \      / \
        11 9 7  5

[java] view plain copy
  1. import java.util.Stack;  
  2. public class Solution {  
  3.      public void Mirror(TreeNode root) {  
  4.            if(root==null)   
  5.                return;  
  6.          Stack<TreeNode>stack=new Stack<TreeNode>();  
  7.          stack.push(root);  
  8.          while(!stack.empty())  
  9.          {  
  10.              TreeNode node=stack.pop();  
  11.              if(node.left!=null||node.right!=null)  
  12.              {  
  13.                  TreeNode nodeleft=node.left;  
  14.                  TreeNode noderight=node.right;  
  15.                  node.left=noderight;  
  16.                  node.right=nodeleft;  
  17.              }  
  18.                 if(node.left!=null)   
  19.                     stack.push(node.left);  
  20.                 if(node.right!=null)  
  21.              stack.push(node.right);   
  22.          }  
  23.         }  
  24. }  

-----------------------------------------------------------------------------------------------------------------

119输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.

[java] view plain copy
  1. import java.util.ArrayList;  
  2. public class Solution {  
  3.     public ArrayList<Integer> printMatrix(int [][] matrix) {  
  4.        int n=matrix.length;  
  5.        int m=matrix[0].length;  
  6.        ArrayList<Integer>res=new ArrayList<Integer>();  
  7.         int i=0;  
  8.         int j=0;  
  9.         int startX=0;  
  10.         int endX=m-1;  
  11.         int startY=0;  
  12.         int endY=n-1;  
  13.         while(startX<=endX&&startY<=endY)  
  14.         {  
  15.             if(startX==endX)  
  16.                 {  
  17.                 for(;i<=endY;i++)  
  18.                 res.add(matrix[i][j]);   
  19.                 return res;  
  20.                 }  
  21.             if(startY==endY)  
  22.                 {  
  23.                 for(;j<=endX;j++)  
  24.                 res.add(matrix[i][j]);   
  25.                 return res;  
  26.                 }  
  27.                  
  28.           for(;j<endX;j++)  
  29.               res.add(matrix[i][j]);  
  30.               
  31.           for(;i<endY;i++)  
  32.               res.add(matrix[i][j]);  
  33.               
  34.           for(;j>startX;j--)  
  35.               res.add(matrix[i][j]);  
  36.               
  37.           for(;i>startY;i--)  
  38.               res.add(matrix[i][j]);  
  39.             i++;  
  40.             j++;  
  41.             startX++;  
  42.             endX--;  
  43.             startY++;  
  44.             endY--;  
  45.               
  46.         }  
  47.   return res;   
  48.     }  
  49. }  

---------------------------------------------------------------------------------------------------------------------------------------------------------------------

120.定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。

[java] view plain copy
  1. import java.util.Stack;  
  2. import java.util.Iterator;  
  3. public class Solution {  
  4.      Stack<Integer>stack=new Stack<Integer>();  
  5.     public void push(int node) {  
  6.        stack.push(node);          
  7.     }  
  8.     public void pop() {  
  9.        stack.pop();   
  10.     }  
  11.     public int top() {  
  12.         return stack.peek();  
  13.     }   
  14.     public int min() {  
  15.         int min=stack.peek();  
  16.         int tmp=0;  
  17.         Iterator<Integer>iterator=stack.iterator();  
  18.         while(iterator.hasNext())  
  19.         {  
  20.             tmp=iterator.next();  
  21.             min=min<=tmp?min:tmp;  
  22.         }  
  23.         return min;  
  24.     }  
  25. }  

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

201输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。

例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,

但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)

[java] view plain copy
  1. import java.util.*;  
  2.   
  3. public class Solution {  
  4.     public boolean IsPopOrder(int [] pushA,int [] popA) {  
  5.       Stack <Integer> stack=new  Stack<Integer> ();  
  6.         int j=0;  
  7.         for(int i=0;i<pushA.length;i++){  
  8.             stack.push(pushA[i]);  
  9.             while(!stack.empty()&&stack.peek()==popA[j]){  
  10.                 j++;  
  11.                 stack.pop();  
  12.     
  13.             }    
  14.         }  
  15.         if(stack.empty())  
  16.             return true;  
  17.         return false;  
  18.     }  
  19. }  
--------------------------------------------------------------------------------------------------------------------------------
202从上往下打印出二叉树的每个节点,同层节点从左至右打印。
[java] view plain copy
  1. import java.util.LinkedList;  
  2. import java.util.Deque;  
  3. public class Solution {  
  4.      public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) {  
  5.          ArrayList<Integer>res=new ArrayList<Integer>();  
  6.          if(root==null)  
  7.              return res;  
  8.          Deque<TreeNode>deq=new LinkedList<TreeNode>();  
  9.          deq.add(root);  
  10.          while(!deq.isEmpty())  
  11.          {  
  12.              TreeNode t=deq.pop();  
  13.              res.add(t.val);  
  14.              if(t.left!=null)  
  15.                  deq.add(t.left);  
  16.              if(t.right!=null)  
  17.                  deq.add(t.right);   
  18.          }  
  19.          return res;   
  20.         }  
  21. }  

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

209.输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。

topK问题,可以用堆解决。

[java] view plain copy
  1. import java.util.ArrayList;  
  2. import java.util.Comparator;  
  3. import java.util.PriorityQueue;  
  4.   
  5. public class Solution {  
  6. public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) {  
  7.     ArrayList<Integer>result=new ArrayList<Integer>();  
  8.     int length = input.length;  
  9.     if(k > length || k == 0){  
  10.         return result;  
  11.     }  
  12.     PriorityQueue<Integer>maxHeap=new PriorityQueue<Integer>(k,new Comparator<Integer>(){  
  13.   
  14.         @Override  
  15.         public int compare(Integer o1, Integer o2) {  
  16.             // TODO Auto-generated method stub  
  17.             return o2.compareTo(o1);  
  18.         }  
  19.     });  
  20.     for(int i=0;i<length;i++){  
  21.         if(maxHeap.size()!=k){  
  22.             maxHeap.offer(input[i]);  
  23.         }  
  24.         else  
  25.             if(maxHeap.peek()>input[i])  
  26.         {  
  27.             maxHeap.poll();  
  28.             maxHeap.offer(input[i]);  
  29.         }  
  30.     }  
  31.         for(Integer i:maxHeap){  
  32.             result.add(i);  
  33.         }     
  34.     return result;  
  35.     }  
  36. }  

----------------------------------------------------------------------------------------------------------------------------------------------------------

210.连续子数组和最大

[java] view plain copy
  1. public class Solution {  
  2.     public int FindGreatestSumOfSubArray(int[] array) {  
  3.         if(array.length==0)  
  4.             return 0;  
  5.          int max=array[0];  
  6.          int total=array[0];  
  7.         for(int i=1;i<array.length;i++)  
  8.             {  
  9.             if(total>0)  
  10.                 total+=array[i];  
  11.             else  
  12.                 total=array[i];     
  13.             max=max>total?max:total;  
  14.               
  15.             }  
  16.         return max;  
  17.     }  
  18. }  

---------------------------------------------------------------------------------------------------------------------------------------------

211求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,

但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。

[java] view plain copy
  1. public class Solution {  
  2.     public int NumberOf1Between1AndN_Solution(int n) {  
  3.         int sum=0;  
  4.         for(int i=1;i<=n;i++)  
  5.          {  
  6.              int tmp=0;  
  7.              String str=String.valueOf(i);  
  8.              for(int j=0;j<str.length();j++)  
  9.              {  
  10.                   if(str.charAt(j)=='1')  
  11.                    tmp++;  
  12.              }  
  13.             sum+=tmp;  
  14.          }  
  15.         return sum;     
  16.     }  
  17.    
  18. }  

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},

则打印出这三个数字能排成的最小数字为321323。

[java] view plain copy
  1. import java.util.*;  
  2. public class Solution {  
  3.      public String PrintMinNumber(int [] numbers) {  
  4.             if(numbers.length==0)  
  5.         return "";  
  6.             int len=numbers.length;  
  7.             compSort(numbers,len);  
  8.             String[] str=new String[len];  
  9.             for(int i=0;i<len;i++)  
  10.          str[i]=String.valueOf(numbers [i]);  
  11.             StringBuffer sb=new StringBuffer();  
  12.              for(int i=0;i<len;i++)  
  13.           sb.append(str[i]);  
  14.               return sb.toString();  
  15.         }  
  16. private void compSort(int[] ch,int length)  
  17. {  
  18.     for(int i=0;i<length-1;i++)  
  19.         for(int j=i+1;j<length;j++)  
  20.         {  
  21.             int mark1=1,mark2=1,m=ch[i],n=ch[j];  
  22.             while(m>=1)  
  23.             {  
  24.                 m/=10;  
  25.                 mark1*=10;  
  26.             }  
  27.             while(n>=1)  
  28.             {  
  29.                 n/=10;  
  30.                 mark2*=10;  
  31.             }  
  32.         if(ch[i]*mark2+ch[j]>ch[j]*mark1+ch[i])  
  33.         {  
  34.             ch[i]=ch[i]+ch[j];  
  35.             ch[j]=ch[i]-ch[j];  
  36.             ch[i]=ch[i]-ch[j];  
  37.         }  
  38.         }     
  39. }  
  40. }  

----------------------------------------------------------------------------------------------------------------------------------

在一个字符串(1<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置。如果字符串为空,返回-1

[java] view plain copy
  1. import java.util.LinkedHashMap;  
  2. public class Solution {  
  3.     public int FirstNotRepeatingChar(String str) {  
  4.         LinkedHashMap<Character,Integer>map=new LinkedHashMap<Character, Integer>();  
  5.           int time=0;  
  6.           for(int i=0;i<str.length();i++){  
  7.               if(map.containsKey(str.charAt(i))){  
  8.                   time=map.get(str.charAt(i));  
  9.                   map.put(str.charAt(i), ++time);//不能用time++  
  10.               }  
  11.               else  
  12.                   map.put(str.charAt(i), 1);  
  13.           }  
  14.          for(int i=0;i<str.length();i++){  
  15.              if(map.get(str.charAt(i))==1){  
  16.                  return i;  
  17.              }  
  18.                
  19.          }  
  20.         return -1;  
  21.     }  
  22. }  

----------------------------------------------------------------------------------------------------------------------------------------------------------------

216输入两个链表,找出它们的第一个公共结点。

[java] view plain copy
  1. public class Solution {  
  2.     /** 
  3.      * 思路:如果有公共节点,1)若两个链表长度相等,那么遍历一遍后,在某个时刻,p1 == p2 
  4.      *                   2)若两个链表长度不相等,那么短的那个链表的指针pn(也就是p1或p2) 
  5.      *                     必先为null,那么这时再另pn = 链表头节点。经过一段时间后, 
  6.      *                     则一定会出现p1 == p2。 
  7.      *      如果没有公共节点:这种情况可以看成是公共节点为null,顾不用再考虑。 
  8.      */  
  9.     public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) {  
  10.         ListNode p1 = pHead1;  
  11.         ListNode p2 = pHead2;  
  12.         while(p1 != p2) {  
  13.             if(p1 != null) p1 = p1.next;    //防止空指针异常  
  14.             if(p2 != null) p2 = p2.next;  
  15.             if(p1 != p2) {                  //当两个链表长度不想等  
  16.                 if(p1 == null) p1 = pHead1;  
  17.                 if(p2 == null) p2 = pHead2;  
  18.             }  
  19.         }  
  20.         return p1;  
  21.     }  
  22. }  

---------------------------------------------------------------------------------------------------------------------------------------------------

217统计一个数字在排序数组中出现的次数

[java] view plain copy
  1. public class Solution {  
  2.      public int GetNumberOfK(int [] array , int k) {  
  3.              
  4.          int length=array.length;  
  5.          if(length==0)  
  6.              return 0;  
  7.          int firstK = getFirstK(array, k, 0, length-1);  
  8.             int lastK = getLastK(array, k, 0, length-1);  
  9.             if(firstK != -1 && lastK != -1){  
  10.                  return lastK - firstK + 1;  
  11.             }  
  12.             return 0;  
  13.         }  
  14.      private int getFirstK(int []array,int  k, int start, int end){  
  15.          int mid=(start+end)>>1;  
  16.          while(start<=end)  
  17.          {  
  18.              if(array[mid]<k){  
  19.                     start=mid+1;  
  20.              }  
  21.              else  
  22.                  {  
  23.                  end=mid-1;  
  24.                  }  
  25.             mid=(start+end)/2;  
  26.          }  
  27.          return start;  
  28.      }  
  29. private int getLastK(int []array,int  k, int start, int end){  
  30.     int mid=(start+end)>>1;  
  31.      while(start<=end)  
  32.      {  
  33.          if(array[mid]<=k){  
  34.                 start=mid+1;  
  35.          }  
  36.          else  
  37.              {  
  38.              end=mid-1;  
  39.              }  
  40.         mid=(start+end)/2;  
  41.      }  
  42.      return end;      
  43. }   
  44. }  

-----------------------------------------------------------------------------------------------------------------------------------

218输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。

[java] view plain copy
  1. public class Solution {  
  2.     public int TreeDepth(TreeNode root) {  
  3.         if(root==null)  
  4.             return 0;  
  5.         return TreeDepth(root.left)>TreeDepth(root.right)?(TreeDepth(root.left)+1):(TreeDepth(root.right)+1);    
  6.     }  
  7. }  

--------------------------------------------------------------------------------------------------------------------------

219输入一棵二叉树,判断该二叉树是否是平衡二叉树。

[java] view plain copy
  1. public class Solution {  
  2. public boolean IsBalanced_Solution(TreeNode root) {  
  3.    if(root==null)   
  4.        return true;  
  5.    int leftDep=TreeDepth(root.left);  
  6.    int rightDep=TreeDepth(root.right);  
  7.     if(leftDep-rightDep>1||leftDep-rightDep<-1)  
  8.         return false;  
  9.     return(IsBalanced_Solution(root.left)&&IsBalanced_Solution(root.right));  
  10.     }  
  11. public int TreeDepth(TreeNode root)  
  12. {  
  13.     if(root==null)  
  14.         return 0;  
  15.     int max=1+TreeDepth(root.left)>1+TreeDepth(root.right)?1+TreeDepth(root.left):1+TreeDepth(root.right);  
  16.     return max;   
  17. }  
  18. }  

-------------------------------------------------------------------------------------------------------------------------------------

220一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。

[java] view plain copy
  1. //num1,num2分别为长度为1的数组。传出参数  
  2. //将num1[0],num2[0]设置为返回结果  
  3. import java.util.*;  
  4. public class Solution {  
  5.     public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {  
  6.         ArrayList<Integer>al=new ArrayList<Integer>();  
  7.         for(int i=0;i<array.length;i++)  
  8.         {  
  9.             if(al.contains(array[i]))  
  10.                 al.remove(new Integer(array[i]));  
  11.             else  
  12.                 al.add(array[i]);  
  13.         }  
  14.           
  15.         num1[0]=al.get(0);  
  16.         num2[0]=al.get(1);  
  17.           
  18.     }  
  19. }  

---------------------------------------------------------------------------------------------------------------------------------------------------

301小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。

但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。

现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!
输出描述:

输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序

[java] view plain copy
  1. import java.util.ArrayList;  
  2. /* 
  3. *初始化small=1,big=2; 
  4. *small到big序列和小于sum,big++;大于sum,small++; 
  5. *当small增加到(1+sum)/2是停止 
  6. */  
  7. public class Solution {  
  8.     public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) {  
  9.         ArrayList<ArrayList<Integer> >lists=new ArrayList<ArrayList<Integer> >();  
  10.         if(sum<=1)     
  11.             return lists;  
  12.         int small=1;  
  13.         int big=2;  
  14.         while(small!=(1+sum)/2){  
  15.             int curSum=sumOfList(small,big);  
  16.             if(curSum==sum)  
  17.             {  
  18.                 ArrayList<Integer>list=new ArrayList<Integer>();  
  19.                 for(int i=small;i<=big;i++)  
  20.                     list.add(i);  
  21.                 lists.add(list);  
  22.                 small++;  //不能忘记符合条件时对数据的增加  
  23.                 big++;  
  24.             }  
  25.             else if(curSum<sum)  
  26.             {  
  27.                 big++;  
  28.             }else  
  29.             {  
  30.                 small++;  
  31.             }  
  32.         }  
  33.         return lists;  
  34.         }  
  35.     private int sumOfList(int start,int end){  
  36.         int sum=0;  
  37.         for(int i=start;i<=end;i++){  
  38.             sum+=i;  
  39.         }  
  40.         return sum;  
  41.     }  
  42. }  

--法二
[java] view plain copy
  1. //根据数学公式计算:(a1+an)*n/2=s  n=an-a1+1  
  2.    
  3.       //(an+a1)*(an-a1+1)=2*s=k*l(k>l)  
  4.    
  5.       //an=(k+l-1)/2  a1=(k-l+1)/2  
  6.    
  7. import java.util.ArrayList;  
  8. public class Solution {  
  9.         public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) {  
  10.             ArrayList<ArrayList<Integer>>list=new ArrayList<ArrayList<Integer>>();  
  11.             if(sum<3)return list;  
  12.             int s=(int) Math.sqrt(2*sum);  
  13.             for(int i=s;i>=2;i--)  
  14.                 {  
  15.                     if(2*sum%i==0)  
  16.                         {  
  17.                             int d=2*sum/i;  
  18.                             if(d%2==0&&i%2!=0||d%2!=0&&i%2==0)  
  19.                                 {  
  20.                                     int a1=(d-i+1)/2;  
  21.                                     int an=(d+i-1)/2;  
  22.                                     ArrayList<Integer>temp=new ArrayList<Integer>();  
  23.                                     for(int j=a1;j<=an;j++)  
  24.                                         temp.add(j);  
  25.                                     list.add(temp);  
  26.                                 }  
  27.                         }  
  28.                 }  
  29.             return list;  
  30.         }  
  31. }  

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。

对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,

即“XYZdefabc”。是不是很简单?OK,搞定它!

[java] view plain copy
  1. public class Solution {  
  2.     public String LeftRotateString(String str,int n) {  
  3.         int len=str.length();  
  4.         if(len == 0)   
  5.             return "";  
  6.         str+=str;  
  7.         return str.substring(n, n+len);  
  8.     }  
  9. }  

---------------------------------------------------------------------------------------------------------------------------------------

一个链表中包含环,请找出该链表的环的入口结点。

第一步,找环中相汇点。分别用p1,p2指向链表头部,p1每次走一步,p2每次走二步,直到p1==p2找到在环中的相汇点。
第二步,找环的入口。接上步,当p1==p2时,p2所经过节点数为2x,p1所经过节点数为x,设环中有n个节点,p2比p1多走一圈有2x=n+x;

n=x;可以看出p1实际走了一个环的步数,再让p2指向链表头部,p1位置不变,p1,p2每次走一步直到p1==p2; 此时p1指向环的入口。

[java] view plain copy
  1. public class Solution {  
  2.    
  3.     ListNode EntryNodeOfLoop(ListNode pHead){  
  4.         if(pHead == null || pHead.next == null)  
  5.             return null;  
  6.         ListNode p1 = pHead;  
  7.         ListNode p2 = pHead;  
  8.         while(p2 != null && p2.next != null ){  
  9.             p1 = p1.next;  
  10.             p2 = p2.next.next;  
  11.             if(p1 == p2){  
  12.                 p2 = pHead;  
  13.                 while(p1 != p2){  
  14.                     p1 = p1.next;  
  15.                     p2 = p2.next;  
  16.                 }  
  17.                 if(p1 == p2)  
  18.                     return p1;  
  19.             }  
  20.         }  
  21.         return null;  
  22.     }  
  23. }  

--------------------------------------------------------------------------------------------------------------------------------------------------------------------

请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。

[java] view plain copy
  1. public class Solution {  
  2.     boolean isSymmetrical(TreeNode pRoot)  
  3.     {  
  4.          if(pRoot==null)   
  5.            return true;  
  6.        return isSymmetrical(pRoot.left, pRoot.right);     
  7.     }  
  8.     private boolean isSymmetrical(TreeNode left, TreeNode right)  
  9.     {  
  10.         if(left==null&&right==null)  
  11.             return true;  
  12.         if(left==null||right==null)  
  13.             return false;  
  14.         if(left.val==right.val)  
  15.             return isSymmetrical(left.left, right.right)&&isSymmetrical(left.right, right.left);  
  16.         return false;  
  17.     }  
  18. }  

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。

[java] view plain copy
  1. import java.util.ArrayList;  
  2. import java.util.Stack;  
  3.   
  4. public class Solution {  
  5.     ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {  
  6.         ArrayList<ArrayList<Integer>>res=new ArrayList<ArrayList<Integer>>();  
  7.         ArrayList<Integer>tmp=new ArrayList<Integer>();  
  8.         if(pRoot==null)  
  9.             return res;  
  10.         Stack<TreeNode>list1=new Stack<TreeNode>();  
  11.         Stack<TreeNode>list2=new Stack<TreeNode>();  
  12.         list1.push(pRoot);  
  13.     while(!list1.empty()||!list2.empty())  
  14.     {  
  15.         if(!list1.empty())  
  16.         {  
  17.             while(!list1.empty())  
  18.             {  
  19.                 TreeNode p=list1.pop();  
  20.                 tmp.add(p.val);  
  21.                 if(p.left!=null)  
  22.                     list2.add(p.left);  
  23.                 if(p.right!=null)  
  24.                     list2.add(p.right);  
  25.             }  
  26.             res.add(new ArrayList<Integer>(tmp));  
  27.             tmp.clear();  
  28.         }  
  29.         if(!list2.empty())  
  30.         {  
  31.             while(!list2.empty())  
  32.             {  
  33.                 TreeNode p=list2.pop();  
  34.                 tmp.add(p.val);  
  35.                 if(p.right!=null)  
  36.                     list1.add(p.right);  
  37.                 if(p.left!=null)  
  38.                     list1.add(p.left);  
  39.             }  
  40.             res.add(new ArrayList<Integer>(tmp));  
  41.             tmp.clear();      
  42.         }     
  43.     }         
  44.     return res;   
  45.     }  
  46. }  

-----------------------------------------------------------------------------------------------------------------------------------------------------------

从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行

[java] view plain copy
  1. import java.util.ArrayList;  
  2. import java.util.LinkedList;  
  3. public class Solution {  
  4.     ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {  
  5.         ArrayList<ArrayList<Integer> >res=new ArrayList<ArrayList<Integer> >();  
  6.         ArrayList<Integer>tmp=new ArrayList<Integer>();  
  7.         LinkedList<TreeNode> q = new LinkedList<TreeNode>();  
  8.         if(pRoot==null)  
  9.             return res;  
  10.         q.add(pRoot);  
  11.         int now=1,next=0;  
  12.         while(!q.isEmpty())  
  13.         {  
  14.             TreeNode t=q.remove();  
  15.             now--;  
  16.             tmp.add(t.val);  
  17.             if(t.left!=null)  
  18.             {  
  19.                 q.add(t.left);  
  20.                 next++;  
  21.             }  
  22.             if(t.right!=null)  
  23.             {  
  24.                 q.add(t.right);  
  25.                 next++;  
  26.             }  
  27.             if(now==0)  
  28.             {  
  29.                 res.add(new ArrayList<Integer>(tmp));  
  30.                 tmp.clear();  
  31.                 now=next;  
  32.                 next=0;  
  33.             }             
  34.         }     
  35.         return res;  
  36.     }  
  37. }  

--------------------------------------------------------------------------------------------------------------------------------

给定一颗二叉搜索树,请找出其中的第k大的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。

[java] view plain copy
  1. public class Solution {  
  2.     TreeNode KthNode(TreeNode pRoot, int k)  
  3.     {  
  4.         if(k<=0||pRoot==null)  
  5.             return null;  
  6.         Stack<TreeNode>LDRstack=new  Stack<TreeNode>();  
  7.         TreeNode p=pRoot;  
  8.         TreeNode res=null;  
  9.         int count=0;  
  10.         while(p!=null||!LDRstack.isEmpty())  
  11.         {  
  12.             while(p!=null)  
  13.             {  
  14.                 LDRstack.push(p);  
  15.                 p=p.left;  
  16.             }  
  17.             TreeNode p1=LDRstack.pop();  
  18.             count++;  
  19.             if(count==k)  
  20.                 res=p1;   
  21.             p=p1.right;  
  22.         }  
  23.           
  24.         return res;  
  25.     }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值