45 翻转单词顺序列

student. a am I----->>> I am a student.

public class Solution {
    public String ReverseSentence(String str) {
        return f1(str.toCharArray());
    }

    public static String f1(char[] chas)
    {
        int l=0;
        int r=chas.length-1;
        reverse(chas,l,r);
        int p1=-1;
        int p2=-1;
        for(int i=0;i<chas.length;i++)
        {
            if(chas[i]!=' ')
            {
                p1=i==0||chas[i-1]==' '?i:p1;
                p2=i==chas.length-1||chas[i+1]==' '?i:p2;
            }
            if(p1!=-1&&p2!=-1)
            {
                reverse(chas,p1,p2);
                p1=-1;
                p2=-1;
            }
        }
        return String.valueOf(chas);
    }
    public static void reverse(char[] chas,int l,int r)
    {
        char tmp=0;
        while(l<r)
        {
            tmp=chas[l];
            chas[l]=chas[r];
            chas[r]=tmp;
            l++;
            r--;
        }
    }
}

总结:注意p1和p2的使用一次遍历出结果

题目46 扑克牌顺子

大小王可以看作是任何数字
(只要保证任意两数字的间隙小于等于0的个数即可)

import java.util.Arrays;
public class Solution {
     public  boolean isContinuous(int [] numbers)
    {
        if(numbers==null||numbers.length==0) return false;
        int big=1;
        int small=0;
        int countZero=0;
        int countInterval=0;
        Arrays.sort(numbers);
        while(big<=numbers.length-1)
        {
            if(numbers[small]==0) 
            {
                countZero++;
            }
            if(numbers[big]==numbers[small]&&numbers[big]!=0) return false;
            if(numbers[small]!=0&&numbers[big]!=0)
            countInterval+=numbers[big]-numbers[small]-1;
            small=big;
            big++;
        }
        if(countInterval<=countZero)
        {
            return true;
        }
        return false;
    }
}

题目47 约瑟夫环问题

题目48 1+2+3+4+....+n

求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。

public class Solution {
    public int Sum_Solution(int n) {
        int res=n;
        if(n>0) res+=Sum_Solution(n-1);
        return res;
    }
}

题目49 不用加减乘除做加法

public class Solution {
public int Add(int a,int b) {
           int sum=a;
           while(b!=0)
           {
               sum=a^b;
               b=(a&b)<<1;
               a=sum;
           }
           return sum;
    }
}

题目50 把字符串转化为整数

public class Solution {
     public  int StrToInt(String str) {
        if(str==null||str.equals("")) return 0;
        char[] chas = str.toCharArray();
        if(!isValid(chas)) return 0;
        boolean pos=true;
        boolean pos2=true;
        if(chas[0]=='-')
        {
            pos=false;
            pos2=false;
        }else if(chas[0]=='+')
        {
            pos=true;
            pos2=false;
        }
        int minq=Integer.MIN_VALUE/10;
        int minr=Integer.MIN_VALUE%10;
        int res=0;
        int cur=0;
        for(int i=pos2?0:1;i<chas.length;i++)
        {
            cur='0'-chas[i];
            if(res<minq||(res==minq&&cur<minr)) return 0;
            res=res*10+cur;
        }
        if(pos&&res==Integer.MIN_VALUE)
            return 0;
        return pos?res*-1:res;
    }
    public static boolean isValid(char[] chas)
    {
        if(chas[0]!='+'&&chas[0]!='-'&&(chas[0]<'0'||chas[0]>'9'))
        {
            return false;
        }
        if((chas[0]=='+'||chas[0]=='-')&&chas.length==1)
        {
            return false;
        }
        for(int i=1;i<chas.length;i++)
        {
            if(chas[i]<'0'||chas[i]>'9')
            {
                return false;
            }
        }
        return true;
    }
}

总结:判断合法和防止溢出的方法

题目51 数组中重复的数字

在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。

public boolean duplicate(int numbers[],int length,int [] duplication) {
        if(numbers == null || length <= 0) {
            return false;
        }

        for(int i = 0; i < length; i++) {
            while(numbers[i] != i) {
                if(numbers[i] == numbers[numbers[i]]) {
                    duplication[0] = numbers[i];
                    return true;
                }
                int temp = numbers[i];
                numbers[i] = numbers[temp];
                numbers[temp] = temp;
            }
        }

        return false;
    }
}

总结:让原本的数字归位

题目52 构建乘积数组

给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]A[1]...A[i-1]*A[i+1]...*A[n-1]。不能使用除法。

import java.util.ArrayList;
public class Solution {
    public int[] multiply(int[] A) {

        int n=A.length;
        int[] B=new int[n];
        if(n!=0)
        {
           B[0]=1;
           for(int i=1;i<n;i++)
           {
               B[i]=B[i-1]*A[i-1];
           }
           int temp=1;
           for(int j=n-2;j>=0;j--)
           {
               temp*=A[j+1];
               B[j]*=temp;
           }
        }
        return B;
    }
}

题目53 正则表达式匹配

public class Solution {
    public boolean match(char[] s, char[] e)
    {
        if(s==null||e==null)
        {
            return false;
        }
        return isValid(s,e)?process(s,e,0,0):false;
    }


    public static boolean isValid(char[] s, char[] e)
    {
        for(int i=0;i<s.length;i++)
        {
            if(s[i]=='*'||s[i]=='.')
            {
                return false;
            }
        }
        for(int i=0;i<e.length;i++)
        {
            if(e[i]=='*'&&(i==0||e[i-1]=='*'))
            {
                return false;
            }
        }
        return true;
    }

    public static boolean process(char[] s,char[] e,int si,int ei)
    {
        if(ei==e.length)
        {
            return si==s.length;
        }

        //值和值的匹配
        if(ei+1==e.length||e[ei+1]!='*')
        {
            return si!=s.length&&(e[ei]==s[si]||e[ei]=='.')
                    &&process(s,e,si+1,ei+1);
        }
        //如果不是值和值的匹配
        while(si!=s.length&&(e[ei]==s[si]||e[ei]=='.'))
        {
             if(process(s,e,si,ei+2))
             {
                 return true;
             }
             si++;
        }
        return process(s,e,si,ei+2);
    }
}

题目54 表示数值的字符串

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符
串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。

public class Solution {
    private int index=0;

    public boolean isNumeric(char[] str)
    {
          if(str.length<1)
          {
              return false;
          }
          boolean flag=scanInteger(str);
          if(index<str.length&&str[index]=='.')
          {
              index++;
              flag=scanUnsignedInteger(str)||flag;
          }
          if(index<str.length&&(str[index]=='E'||str[index]=='e'))
          {
              index++;
              flag=flag&&scanInteger(str);
          }
          return flag&&index==str.length;
    }

    private boolean scanInteger(char[] str)
    {
        if(index<str.length&&(str[index]=='+'||str[index]=='-'))
        {
            index++;
        }
        return scanUnsignedInteger(str);
    }

    private boolean scanUnsignedInteger(char[] str)
    {
        int start=index;
        while(index<str.length&&str[index]>='0'&&str[index]<='9')
        {
            index++;
        }
        return start<index;
    }

}

题目55 字符流中第一个不重复的字符

题目56 链表中环的入口结点

public class Solution {

    public ListNode EntryNodeOfLoop(ListNode head)
    {
        if(head==null||head.next==null||head.next.next==null) return null;
        ListNode p1=head.next;
        ListNode p2=head.next.next;
        while(p1!=p2)
        {
            if(p2.next==null||p2.next.next==null) return null;
            p1=p1.next;
            p2=p2.next.next;
        }
        p2=head;
        while(p1!=p2)
        {
            p1=p1.next;
            p2=p2.next;
        }
        return p1;
    }
}

题目57 删除链表中重复的结点

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5

/*
 public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}
*/
public class Solution {
    public ListNode deleteDuplication(ListNode pHead)
    {
       if (pHead==null || pHead.next==null){return pHead;}
       ListNode Head = new ListNode(0);
       Head.next = pHead;
       ListNode pre  = Head;
       ListNode last = Head.next;
       while (last!=null){
          if(last.next!=null && last.val == last.next.val){
          // 找到最后的一个相同节点
           while (last.next!=null && last.val == last.next.val){
              last = last.next;
           }
           pre.next = last.next;
           last = last.next;
           }else{
           pre = pre.next;
           last = last.next;
      }
   }
       return Head.next;
    }
}

题目58 二叉树的下一个结点

public class Solution {
    public TreeLinkNode GetNext(TreeLinkNode head)
    {
         if(head==null) return null;
        if(head.right!=null)
        {
            return getMostLeft(head.right);
        }
        else
        {
            TreeLinkNode parent=head.next;
            while(parent!=null&&parent.left!=head)
            {
                head=parent;
                parent=head.next;
            }
            return parent;
        }
    }

     public static TreeLinkNode getMostLeft(TreeLinkNode head)
    {
        if(head==null) return null;
        while(head.left!=null)
        {
            head=head.left;
        }
        return head;
    }
}

题目60 对称的二叉树

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

/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
public class Solution {
    boolean isSymmetrical(TreeNode pRoot)
    {
        if(pRoot == null){
            return true;
        }
        return comRoot(pRoot.left, pRoot.right);
    }

    private boolean comRoot(TreeNode left, TreeNode right) {
        // TODO Auto-generated method stub
        if(left == null) return right==null;
        if(right == null) return false;
        if(left.val != right.val) return false;
        return comRoot(left.right, right.left) && comRoot(left.left, right.right);
    }
}

题目61 按之字形顺序打印二叉树

import java.util.ArrayList;
import java.util.LinkedList;

/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
public class Solution {
    public ArrayList<ArrayList<Integer> > Print(TreeNode head) {

        ArrayList<ArrayList<Integer> > allList=new ArrayList<>();
        if(head==null) return allList;
        ArrayList<Integer> list=new ArrayList<>();
        LinkedList<TreeNode> queue=new LinkedList<>();
        queue.add(head);
        boolean lr=true;
        TreeNode last=head;
        TreeNode nextLast=null;
        TreeNode cur=null;
        while(!queue.isEmpty())
        {
            if(lr)//如果是true 左--->右
            {
               cur = queue.pollFirst();
               if(cur.left!=null)
               {
                   queue.addLast(cur.left);
                   nextLast=nextLast==null?cur.left:nextLast;
               }
               if(cur.right!=null)
               {
                   queue.addLast(cur.right);
                   nextLast=nextLast==null?cur.right:nextLast;
               }
            }
            else  //如果是false 右--->左
            {
                cur = queue.pollLast();
                if(cur.right!=null)
                {
                    queue.addFirst(cur.right);
                    nextLast=nextLast==null?cur.right:nextLast;
                }
                if(cur.left!=null)
                {
                    queue.addFirst(cur.left);
                    nextLast=nextLast==null?cur.left:nextLast;
                }
            }
            list.add(cur.val);
            if(cur==last&&!queue.isEmpty())
            {
                lr=!lr;
                last=nextLast;
                nextLast=null;
                allList.add(new ArrayList<>(list));
                list=new ArrayList<>();
            }
        }
        allList.add(new ArrayList<>(list));
        return allList;
    }
}

题目62 按层打印二叉树

import java.util.ArrayList;
import java.util.LinkedList;

/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
public class Solution {
    ArrayList<ArrayList<Integer>> Print(TreeNode head) {

        ArrayList<ArrayList<Integer>> allList=new ArrayList<>();
        if(head==null) return  allList;
        ArrayList<Integer> list=new ArrayList<>();
        LinkedList<TreeNode> queue=new LinkedList<>();
        queue.add(head);
        TreeNode last=head;
        TreeNode nextLast=null;
        while(!queue.isEmpty())
        {
            TreeNode cur = queue.pollLast();
            list.add(cur.val);
            if(cur.left!=null)
            {
                queue.addFirst(cur.left);
                nextLast=cur.left;
            }
            if(cur.right!=null)
            {
                queue.addFirst(cur.right);
                nextLast=cur.right;
            }
            if(cur==last&&!queue.isEmpty())
            {
                allList.add(new ArrayList<>(list));
                list=new ArrayList<>();
                last=nextLast;
            }
        } 
        allList.add(new ArrayList<>(list));
        return allList;
    }
}

题目63 序列化二叉树

/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;
    }
}
*/
import java.util.LinkedList;
public class Solution {
    String Serialize(TreeNode head) {
         if(head==null) return "#!";
         String res=head.val+"!";
         res+=Serialize(head.left);
         res+=Serialize(head.right);
        return res;
   }
    TreeNode Deserialize(String str) {
        String[] strs=str.trim().split("!");
        LinkedList<String> queue=new LinkedList<>();
        for(int i=0;i<strs.length;i++)
        {
            queue.add(strs[i]);
        }
        TreeNode head = f(queue);
        return head;
  }
    public static TreeNode f(LinkedList<String> list)
    {
        String cur = list.poll();
        if(cur.equals("#"))
        {
            return null;
        }
        TreeNode head=new TreeNode(Integer.parseInt(cur));
        head.left=f(list);
        head.right=f(list);
        return head;
    }
}

题目64 二叉搜索树的第K个结点

/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
public class Solution {
    TreeNode KthNode(TreeNode head, int k)
    {
        if(head==null) return null;
        TreeNode cur1=head;
        TreeNode cur2=null;
        while(cur1!=null)
        {
            cur2=cur1.left;
            if(cur2!=null)
            {
                while(cur2.right!=null&&cur2.right!=cur1)
                {
                    cur2=cur2.right;
                }
                if(cur2.right==null)
                {
                    cur2.right=cur1;
                    cur1=cur1.left;
                    continue;
                }
                else
                {
                    cur2.right=null;
                }
            }
            k--;//System.out.println(cur1.value);
            if(k==0)
            {
                return cur1;
            }
            cur1=cur1.right;
        }
        return null;
    }
}

题目65 数据流中的中位数

import java.util.*;
public class Solution {

   private PriorityQueue<Integer> maxHeap=new PriorityQueue<Integer>(new MaxHeapComparator());
   private PriorityQueue<Integer> minHeap=new PriorityQueue<Integer>(new MinHeapComparator());

     private void modifyTwoHeapSize()
        {
            if(this.maxHeap.size()==this.minHeap.size()+2)
            {
                this.minHeap.add(this.maxHeap.poll());
            }
            if(this.maxHeap.size()+2==this.minHeap.size())
            {
                this.maxHeap.add(this.minHeap.poll());
            }
        }

    public void Insert(Integer num) {
         //最开始,向大顶堆中添加
            if(this.maxHeap.isEmpty())
            {
                this.maxHeap.add(num);
                return ;
            }
            //如果小于大顶堆的头,我们向大顶堆中添加
            if(this.maxHeap.peek()>=num)
            {
                this.maxHeap.add(num);
            }else //如果大于大顶堆的头
            {
                //如果小顶堆为空
                if(this.minHeap.isEmpty())
                {
                    this.minHeap.add(num);
                    return ;
                }

                if(this.minHeap.peek()>num)
                {
                    this.maxHeap.add(num);
                }else
                {
                    this.minHeap.add(num);
                }
            }
            modifyTwoHeapSize();
    }

    public Double GetMedian() {
         int maxHeapSize=this.maxHeap.size();
            int minHeapSize=this.minHeap.size();

            if(maxHeapSi***HeapSize==0) return (double)0;
            Integer maxHeapHead=this.maxHeap.peek();
            Integer minHeapHead=this.minHeap.peek();
            if(((maxHeapSi***HeapSize)&1)==0)
            {
                double f=(double)(maxHeapHead+minHeapHead)/2;
                return f;
            }
            int res=maxHeapSi***HeapSize?maxHeapHead:minHeapHead;
            double resd=(double)res;
            return resd;
    }


    public static class MaxHeapComparator implements Comparator<Integer>
    {
        @Override
        public int compare(Integer o1, Integer o2) {
            if(o2>o1)
            {
                return 1;
            }else
            {
                return -1;
            }
        }
    }
    public static class MinHeapComparator implements Comparator<Integer>
    {
        @Override
        public int compare(Integer o1, Integer o2) {
            if(o2<o1)
            {
                return 1;
            }else
            {
                return -1;
            }
        }
    }

}

题目66 滑动窗口的最大值

import java.util.ArrayList;
import java.util.LinkedList;
public class Solution {
    public ArrayList<Integer> maxInWindows(int [] arr, int k)
    {

        ArrayList<Integer> list=new ArrayList<>();
         if(k==0) return list;
        LinkedList<Integer> queue=new LinkedList<>();
        for(int i=0;i<arr.length;i++)
        {
            while(!queue.isEmpty()&&arr[queue.peekLast()]<=arr[i])
            {
                queue.pollLast();
            }
            queue.addLast(i);
           if(queue.peekFirst()<=i-k)
            {
                queue.pollFirst();
            }
            if(i>=k-1)
            {
                list.add(arr[queue.peekFirst()]);
            }
        }
        return list;
    }
}