zoukankan      html  css  js  c++  java
  • Java算法

    1.二维数组中的查找

    时间限制:1秒    空间限制:32768K

    题目描述:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 

    输入描述:

    array: 待查找的二维数组

    target:查找的数字

    输出描述:

    查找到返回true,查找不到返回false

    思路:首先我们选择从左下角开始搜寻,(为什么不从左上角开始搜寻,左上角向右和向下都是递增,那么对于一个点,对于向右和向下会产生一个岔路;如果我们选择从左下脚开始搜寻的话,如果大于就向右,如果小于就向下)。
      public boolean Find(int [][] array,int target) { 
            int len = array.length-1;
            int i = 0;
            while((len >= 0)&& (i < array[0].length)){
                if(array[len][i] > target){
                    len--;
                }else if(array[len][i] < target){
                    i++;
                }else{
                    return true;
                }
            }
            return false;
        }
    答案

    2.替换空格

    • 时间限制:1秒   空间限制:32768K

    题目描述:请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

     public String replaceSpace(StringBuffer str) {
            return str.toString().replaceAll("\s", "%20");
        }
    
    
    
    
     public String replaceSpace(StringBuffer str) {
            return str.toString().replace(" ", "%20");
        }
    答案

    3.从尾到头打印链表

    • 时间限制:1秒   空间限制:32768K

    题目描述:输入一个链表,从尾到头打印链表每个节点的值。 

    输入描述:输入为链表的表头

    输出描述:输出为需要打印的“新链表”的表头

    思路:代码思路借助栈,遍历的时候入栈,由于数据结构中栈的特点是先进后出,所以遍历的过程中压栈,推栈,完了弹栈加到ArrayList中。有两个容易出错的地方:第一,第一次测试用例,{}返回[ ],null是null,而[ ]是new ArrayList()但是没有数据。第二,遍历stack用的方法是!stak.isEmpty()方法,而不是for循环size遍历。。
    /**
    *    public class ListNode {
    *        int val;
    *        ListNode next = null;
    *
    *        ListNode(int val) {
    *            this.val = val;
    *        }
    *    }
    *
    */
    import java.util.Stack;
    import java.util.ArrayList;
    public class Solution {
        public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
            if(listNode == null){
                ArrayList list = new ArrayList();
                return list;
            }
            Stack<Integer> stk = new Stack<Integer>();
            while(listNode != null){
                stk.push(listNode.val);
                listNode = listNode.next;
            }
            ArrayList<Integer> arr = new ArrayList<Integer>();
            while(!stk.isEmpty()){
                arr.add(stk.pop());
            }
            return arr;
        }
    }
    答案

    4.重建二叉树

    • 时间限制:1秒     空间限制:32768K

    题目描述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

    /**
     * Definition for binary tree
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    import java.util.HashMap;
    public class Solution {
        public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
            
            if(pre == null || in == null){
                return null;
            }
            HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
            for(int i=0;i<pre.length;i++){
                map.put(in[i],i);
            }
             
            return preIn(pre, 0, pre.length-1, in, 0, in.length-1, map);
            
        }
        
          public TreeNode preIn(int[] pre, int p1, int p2, int[] in, int i1, int i2, HashMap<Integer,Integer> map){
            if(p1>p2){
                return null;
            }
            TreeNode parent = new TreeNode(pre[p1]);
            int parentInIndex = map.get(pre[p1]);
            parent.left = preIn(pre, p1+1, p1+parentInIndex-i1, in, i1, parentInIndex-1, map);
            parent.right = preIn(pre, p1+parentInIndex-i1+1, p2, in, parentInIndex+1, i2, map);
            return parent;
        }
    }
    答案

    5.用两个栈实现队列

    • 时间限制:1秒    空间限制:32768K

    题目描述:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。

    思路:通过所有测试用例的代码:思路:有两个栈,栈1和栈2.当入栈的时候,我们将它全放进栈1中,当需要出栈的时候,我们将栈1出栈到栈2中,然后再将栈2依次出栈。所以入栈的时候,思路很简单,注意到要将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() {
            if(stack2.isEmpty()){
                while(!stack1.isEmpty()){
                    stack2.push(stack1.pop());
                }
            }
            return stack2.pop().intValue();
        }
        
    }
    答案
  • 相关阅读:
    4、10种数组去重的方法
    3.实现一个函数clone 可以对Javascript中的五种主要数据类型(Number、string、Object、Array、Boolean)进行复制
    2.怎么添加、移除、复制、创建、和查找节点
    1.简述同步和异步的区别
    89. 一行或多行文本超出隐藏
    88.阐述一下CSS Sprites(雪碧图)
    87、CSS属性overflow属性定义溢出元素内容区的内容会如何处理
    86.style标签写在body后与body前有什么区别?
    正则表达式:获取运算符之间变量
    反射问题(欢迎交流)
  • 原文地址:https://www.cnblogs.com/longqingyang/p/5583299.html
Copyright © 2011-2022 走看看