剑指offer java

2.实现单例模式

静态内部类

 class Singleton{
      private Singleton(){}//私有构造方法,避免外部创建实例
      private static class SingletonHolder
         {
          public static final Singleton instance= new Singleton();
         }
      public static Singleton getInstance()
         {
          return SingletonHolder.instance;
        }
}

3.二维数组中的查找

public class FindInt {
    public static boolean Find(int[][] array, int target) {
        int rows = array.length;
        int columns = array[0].length;
        boolean found = false;
        if (array != null && rows > 0 && columns > 0) {
            int row = 0;
            int column = columns - 1;
            while (row <rows&&column>=0) {
                int tempValue = array[row][column];
                if (target > tempValue) {
                    row++;
                } else if (target < tempValue) {
                    column--;

                } else {
                    found = true;
                    break;
                }
            }
        }
        return found;
    }

    public static void main(String[] args) {
        int [][] a = {{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}};
        System.out.println(Find(a,14));
    }

}

4.替换空格

先边里空格数,申请能容下的数组,用两个指针,一个在数组尾部,一个在字符串尾部,字符串尾部指针不段向前,一旦指向字符就复制字符到后面指针所在地址,遇到空格时,后面指针向前移动三格,当两个指针重合时结束。

public class Solution {
    public String replaceSpace(StringBuffer str) {
             for(int k=0; k<str.length(); k++)  {  
                char index = str.charAt(k);  
                if(index == ' ')  
                   str.replace(k, k+1, "%20");  
             }  
              return str.toString();  
    }
}

5.从尾到头打印链表

从头到尾遍历链表放入栈中。

import java.util.Stack;

class ListNode{
    ListNode next=null;
    int val;
    ListNode(int val){
        this.val=val;
    }

}
public class PrintListFromTailToHead {
    public static  void printListFromTailToHead(ListNode listnode){
        Stack<Integer> stack=new Stack<>();
        while(listnode!=null){
            stack.push(listnode.val);
            listnode=listnode.next;
        }
        while(!stack.isEmpty()){
            System.out.print(stack.pop()+" ");
        }
    }

    public static void main(String[] args) {
        ListNode a=new ListNode(1);
        ListNode b=new ListNode(2);
        ListNode c=new ListNode(3);
        ListNode e=new ListNode(4);
        ListNode f=new ListNode(5);
        ListNode g=new ListNode(6);
        a.next=b;
        b.next=c;
        c.next=e;
        e.next=f;
        f.next=g;
        printListFromTailToHead(a);
    }
}

7.两个栈实现队列

//两个栈实现一个队列
import java.util.Stack;

public class TwoStackQueue {
    Stack<Integer> in = new Stack<Integer>();
    Stack<Integer> out = new Stack<Integer>();

    public void push(int node) {
        in.push(node);
    }

    public int pop() throws Exception {
        if (out.isEmpty())
            while (!in.isEmpty())
                out.push(in.pop());
        if (out.isEmpty())
            throw new Exception("queue is empty");
        return out.pop();
    }

}

9.斐波那契数列

下面方法避免了递归的重复计算

public class Fibo {
    public static  long fibo(int n){
        if(n<=1) return n;
        long FibN=0;
        long Fibone=0;
        long Fibtwo=1;
        for(int i=2;i<=n;i++){
            FibN=Fibone+Fibtwo;
            Fibone=Fibtwo;
            Fibtwo=FibN;
        }
        return FibN;
    }

    public static void main(String[] args) {
       System.out.println(fibo(2));
    }
}

10.二进制中1的个数

减1后与原整数做与运算,会把该整数最右边的一个1变成0。有多少个1就可以进行多少次操作,用count计数。

public class NumOf1 {
    public static int NumOf1(int n) {
        int count = 0;
        while (n>0) {
            count++;
            n = (n-1)&n;
        }
        return count;
    }

    public static void main(String[] args) {
        System.out.println(NumOf1(11));
    }

}

13.在O(1)时间删除链表节点

得到要删除的节点的下一个节点,把下一个节点的内容复制到要删除的节点上覆盖原有的内容,再把下一个节点删除。就不需要遍历找该节点了。

15.查找链表倒数第K个节点

import org.junit.Test;

public class TheKthNodeFromTail {
    @Test
    public ListNode main(ListNode head,int k) {
        ListNode listNode=head;
        if(listNode==null||k<=0)
           return  null;
        ListNode nodeA=head;
        for(int i=1;i<k;i++) {
            if (listNode != null) {
                listNode=listNode.next;
            }
            else{
                return null;
            }
        }
        while(listNode.next!=null){
            listNode=listNode.next;
            nodeA=nodeA.next;
        }
        return nodeA;
    }
}

16.反转链表

/*class ListNode{
    ListNode   next=null;
    int val;
    ListNode(int val){
        this.val=val;
    }
}*/

public class ReverseList {
     public  static ListNode reverselist(ListNode listNode){
        ListNode Rhead=null;
        ListNode now=listNode;
        ListNode pre=null;
        while(now!=null){
            ListNode next=now.next;
            if(next==null){
                Rhead=now;
            }
            now.next=pre;
            pre=now;
            now=next;
        }
        return Rhead;
     }
}

17.合并两个排序的链表

public class MergeListNode {
    static ListNode Merge(ListNode head1,ListNode head2){
        if(head1==null)
            return head2;
        if(head2==null)
            return head1;
        ListNode Mhead=null;
        if(head1.val<head2.val){
            Mhead=head1;
            Mhead.next=Merge(head1.next,head2);
        }
        else{
            Mhead=head2;
            Mhead.next=Merge(head1,head2.next);
        }
        return Mhead;
    }

    public static void main(String[] args) {
        ListNode a=new ListNode(1);
        ListNode b=new ListNode(2);
        ListNode c=new ListNode(3);
        ListNode e=new ListNode(4);
        ListNode f=new ListNode(5);
        ListNode g=new ListNode(6);
        a.next=c;
        b.next=e;
        c.next=f;
        e.next=g;
        System.out.println(Merge(a,b).val);
    }
}

18.树的子结构

public boolean isSubtree(TreeNode s, TreeNode t) {
    if (s == null) return false;
    return isSubtreeWithRoot(s, t) || isSubtree(s.left, t) || isSubtree(s.right, t);
}

private boolean isSubtreeWithRoot(TreeNode s, TreeNode t) {
    if (t == null && s == null) return true;
    if (t == null || s == null) return false;
    if (t.val != s.val) return false;
    return isSubtreeWithRoot(s.left, t.left) && isSubtreeWithRoot(s.right, t.right);
}

19.二叉树的镜像

public boolean isSymmetric(TreeNode root) {
    if (root == null) return true;
    return isSymmetric(root.left, root.right);
}

private boolean isSymmetric(TreeNode t1, TreeNode t2) {
    if (t1 == null && t2 == null) return true;
    if (t1 == null || t2 == null) return false;
    if (t1.val != t2.val) return false;
    return isSymmetric(t1.left, t2.right) && isSymmetric(t1.right, t2.left);
}

25.二叉树和为某一值的路径 java

public void findPath(BinaryTreeNode root,int k){    
       if(root == null)    
           return;    
       Stack<Integer> stack = new Stack<Integer>();    
       findPath(root,k,stack);    
   }    
   public void findPath(BinaryTreeNode root,int k,Stack<Integer> path){    
       if(root == null)    
           return;    
       if(root.leftNode == null && root.rightNode == null){    
           if(root.value == k){    
               System.out.println("路径开始");    
               for(int i :path)    
                   System.out.print(i+",");    
               System.out.print(root.value);    
           }    
       }    
       else{    
           path.push(root.value);    
           findPath(root.leftNode,k-root.value,path);    
           findPath(root.rightNode,k-root.value,path);    
           path.pop();    
       }    
   }    

字符串的全排列

/**
  * 参数array:给定字符串的字符数组
     * 参数start:开始遍历字符与其后面各个字符将要进行交换的位置
     * 参数end:字符串数组的最后一位
     * 函数功能:输出字符串数字的各个字符全排列递归实现
     *
     */
public class PermutationAll {
    public static void main(String[] args){
        String s = "abcd";
        char[] array = s.toCharArray();
        recursion(array,0,array.length-1);
    }

    public static void recursion(char[] array,int start,int end){
        if(end <= 1)
            return;
        if(start == end){
            for(int i = 0;i < array.length;i++)
                System.out.print(array[i]);
            System.out.println();
        }
        else{
            for(int i = start;i <= end;i++){
                swap(array,i,start);
                recursion(array,start+1,end);
                swap(array,i,start);
            }
        }
    }
    //交换数组m位置和n位置上的值
    public static void swap(char[] array,int m,int n){
        char temp = array[m];
        array[m] = array[n];
        array[n] = temp;
    }
}

31.连续子数组最大和(动态规划)

设置两个变量,一个currentMax用来记录数组相加之和,一个sumMax用来记录最大的子数组和,一旦currentMax大于sumMax,就更新sumMax使它等于currentMax;初始值都赋予数组的第一个元素的值;

public static int maxsubarr(int[] array)
    {
        if(array == null || array.length == 0)
            return 0;
        int Max = array[0];
        int preSum = array[0];//保存子数组相加之和
        //从头开始遍历相加数组中的元素
        for (int i = 1; i < array.length; i++)
        {
            //若是相加之和一旦小于零,子数组从新开始,否则相加
            preSum=preSum < 0? array[i]:preSum + array[i];
            //sumMax保存最大的子数组的和
            Max=Math.max(Max,preSum);
        }

        return Max;
    }

之字型打印二叉树

import org.junit.Test;


import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Stack;

/**
 * Z字型打印二叉树
 */
public class PrintBintreeByZ {

    @Test
    public void print() {
        TreeNode root=new TreeNode(1);
        TreeNode b=new TreeNode(2);
        TreeNode c= new TreeNode(3);
        TreeNode d=new TreeNode(4);
        TreeNode e=new TreeNode(5);
        root.left=b;
        root.right=c;
        b.left=d;
        c.right=e;

        List<List> listall = new ArrayList<>();
        Stack<TreeNode> nowStack = new Stack<>();
        nowStack.push(root);
        boolean flag=false;
        while (!nowStack.isEmpty()) {
            flag=!flag;
            Stack<TreeNode> nextStack = new Stack<>();
            List<Integer> listone = new ArrayList<>();
            for(TreeNode node:nowStack) {
                listone.add(node.val);
                if (node.right != null)
                    nextStack.add(node.right);
                if (node.left != null)
                    nextStack.add(node.left);
            }
            nowStack = nextStack;
            if(flag)
                Collections.reverse(listone);
            listall.add(listone);
        }
        System.out.println(listall);
    }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,922评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,591评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,546评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,467评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,553评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,580评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,588评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,334评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,780评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,092评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,270评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,925评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,573评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,194评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,437评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,154评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352

推荐阅读更多精彩内容

  • 注意:本文适用于已刷过题目,想短短几分钟快速简单回顾的情况。没看过《剑指offer》的读者建议先阅读下。 斐波那契...
    FeelsChaotic阅读 1,719评论 2 8
  • 说明: 本文中出现的所有算法题皆来自牛客网-剑指Offer在线编程题,在此只是作为转载和记录,用于本人学习使用,不...
    秋意思寒阅读 1,152评论 1 1
  • 1 序 2016年6月25日夜,帝都,天下着大雨,拖着行李箱和同学在校门口照了最后一张合照,搬离寝室打车去了提前租...
    RichardJieChen阅读 5,096评论 0 12
  • 链表 记录《剑指offer》中所有关于链表的题目,以及LeetCode中的相似题目 相关题目列表 题目 链表是面试...
    wenmingxing阅读 1,162评论 0 11
  • 王梅梅漂亮吗?算了吧。 她小学四年级读完后就不上了,她家和我家是一排,只隔三户,所以我知道她是因为暑假里他爸去世才...
    帕特森J阅读 466评论 0 2