zoukankan      html  css  js  c++  java
  • 《剑指Offer 1.二维数组中的查找》2019-03-25

    剑指Offer  第一题

      

    题目描述

    在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
     
     
    本人简单的解题思路  就是通过二重循环,遍历。查找数组中是否有目标数字,思路是简单的,但是有个小坑 ,就是没有进行数组越界判断  
    少判断了  array = [ [ ] ] 这种情况,最终通过的代码为
      
    public class Solution {
        public boolean Find(int target, int [][] array) {
                if(array[0].length<=0)
                      return false;
              for(int i = 0 ;i<array.length;i++)
              {
                  for(int j = 0;j<array.length;j++)
                  {
                      if(array[i][j] == target)
                      {
                          return true;
                      }
                  }
              }
              return false;
        }
    }

    但是这样的效率就很低下了,还能进行优化,参考一下大佬们是怎么进行优化的。

    
    
    两种思路
    一种是:
    把每一行看成有序递增的数组,
    利用二分查找,
    通过遍历每一行得到答案,
    时间复杂度是nlogn
    public class Solution {
        public boolean Find(int [][] array,int target) {
             
            for(int i=0;i<array.length;i++){
                int low=0;
                int high=array[i].length-1;
                while(low<=high){
                    int mid=(low+high)/2;
                    if(target>array[i][mid])
                        low=mid+1;
                    else if(target<array[i][mid])
                        high=mid-1;
                    else
                        return true;
                }
            }
            return false;
     
        }
    }
     
    另外一种思路是:
    利用二维数组由上到下,由左到右递增的规律,
    那么选取右上角或者左下角的元素a[row][col]与target进行比较,
    当target小于元素a[row][col]时,那么target必定在元素a所在行的左边,
    即col--;
    当target大于元素a[row][col]时,那么target必定在元素a所在列的下边,
    即row++public class Solution {
        public boolean Find(int [][] array,int target) {
            int row=0;
            int col=array[0].length-1;
            while(row<=array.length-1&&col>=0){
                if(target==array[row][col])
                    return true;
                else if(target>array[row][col])
                    row++;
                else
                    col--;
            }
            return false;
     
        }
    }

    其中还有点小坑 ,就是一定要确定好  数组遍历的起始位置。

    题目二、

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

    我的实现代码:

      

    public class Solution {
        public String replaceSpace(StringBuffer str) {
            return str.toString().replace(" ", "%20");
        }
    }

    总感觉自己实现的有点弱。这个题应该不会这么简单,膜拜一下大佬的代码去。

    链接:https://www.nowcoder.com/questionTerminal/4060ac7e3e404ad1a894ef3e17650423
    来源:牛客网
    
    /*
    问题1:替换字符串,是在原来的字符串上做替换,还是新开辟一个字符串做替换!
    问题2:在当前字符串替换,怎么替换才更有效率(不考虑java里现有的replace方法)。
          从前往后替换,后面的字符要不断往后移动,要多次移动,所以效率低下
          从后往前,先计算需要多少空间,然后从后往前移动,则每个字符只为移动一次,这样效率更高一点。
    */
    public class Solution {
        public String replaceSpace(StringBuffer str) {
            int spacenum = 0;//spacenum为计算空格数
            for(int i=0;i<str.length();i++){
                if(str.charAt(i)==' ')
                    spacenum++;
            }
            int indexold = str.length()-1; //indexold为为替换前的str下标
            int newlength = str.length() + spacenum*2;//计算空格转换成%20之后的str长度
            int indexnew = newlength-1;//indexold为为把空格替换为%20后的str下标
            str.setLength(newlength);//使str的长度扩大到转换成%20之后的长度,防止下标越界
            for(;indexold>=0 && indexold<newlength;--indexold){ 
                    if(str.charAt(indexold) == ' '){  //
                    str.setCharAt(indexnew--, '0');
                    str.setCharAt(indexnew--, '2');
                    str.setCharAt(indexnew--, '%');
                    }else{
                        str.setCharAt(indexnew--, str.charAt(indexold));
                    }
            }
            return str.toString();
        }
    }

    看了别人的代码之后,整个人都不好了,感觉自己实现的太简单了。

    题目描述

    输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。
     
    思路:一开始的思路就是直接遍历 ListNode ,然后一个一个的放入ArrayList中,但是后来发现这个ListNode是自己写的,只能通过一个一个的判断.next 是否为空了,然后通过递归 或者  
    循环  添加所有的元素
    /**
    *    public class ListNode {
    *        int val;
    *        ListNode next = null;
    *
    *        ListNode(int val) {
    *            this.val = val;
    *        }
    *    }
    *
    */
    import java.util.ArrayList;
    public class Solution {
         ArrayList list = new ArrayList<Integer>();
        public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
            if(listNode!=null){
                this.printListFromTailToHead(listNode.next);
                list.add(listNode.val);
            }
            return list;
        }
    }
  • 相关阅读:
    【竞赛笔记】飞思卡尔智能车竞赛
    【实习笔记】智能广场健身设备总结
    RabbitMQ之安装
    数据结构与算法之队列
    joda-time时间操作组件
    JavaScript中的跨域问题
    数据结构与算法之链表
    Jedis集成到项目中
    ICMP协议和ping命令
    jedis的使用
  • 原文地址:https://www.cnblogs.com/kangxinxin/p/10597339.html
Copyright © 2011-2022 走看看