《剑指Offer 1.二维数组中的查找》2019-03-25

Posted kangxinxin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《剑指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;
    }
}

 

以上是关于《剑指Offer 1.二维数组中的查找》2019-03-25的主要内容,如果未能解决你的问题,请参考以下文章

Java 剑指offer 二维数组中的查找

剑指offer04二维数组中的查找

剑指 Offer 04. 二维数组中的查找

剑指offer-二维数组中的查找

剑指offer--1.二维数组中的查找

剑指Offer——二维数组中的查找