剑指Offer  第一题

  

题目描述

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

  1. public class Solution {
  2. public boolean Find(int target, int [][] array) {
  3. if(array[0].length<=0)
  4. return false;
  5. for(int i = 0 ;i<array.length;i++)
  6. {
  7. for(int j = 0;j<array.length;j++)
  8. {
  9. if(array[i][j] == target)
  10. {
  11. return true;
  12. }
  13. }
  14. }
  15. return false;
  16. }
  17. }

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

  1.  
  1. 两种思路
  2. 一种是:
  3. 把每一行看成有序递增的数组,
  4. 利用二分查找,
  5. 通过遍历每一行得到答案,
  6. 时间复杂度是nlogn
  7. public class Solution {
  8. public boolean Find(int [][] array,int target) {
  9.  
  10. for(int i=0;i<array.length;i++){
  11. int low=0;
  12. int high=array[i].length-1;
  13. while(low<=high){
  14. int mid=(low+high)/2;
  15. if(target>array[i][mid])
  16. low=mid+1;
  17. else if(target<array[i][mid])
  18. high=mid-1;
  19. else
  20. return true;
  21. }
  22. }
  23. return false;
  24.  
  25. }
  26. }
  27.  
  28. 另外一种思路是:
  29. 利用二维数组由上到下,由左到右递增的规律,
  30. 那么选取右上角或者左下角的元素a[row][col]与target进行比较,
  31. target小于元素a[row][col]时,那么target必定在元素a所在行的左边,
  32. col--;
  33. target大于元素a[row][col]时,那么target必定在元素a所在列的下边,
  34. row++;
  35. public class Solution {
  36. public boolean Find(int [][] array,int target) {
  37. int row=0;
  38. int col=array[0].length-1;
  39. while(row<=array.length-1&&col>=0){
  40. if(target==array[row][col])
  41. return true;
  42. else if(target>array[row][col])
  43. row++;
  44. else
  45. col--;
  46. }
  47. return false;
  48.  
  49. }
  50. }

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

题目二、

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

我的实现代码:

  

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

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

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

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

题目描述

输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。
 
思路:一开始的思路就是直接遍历 ListNode ,然后一个一个的放入ArrayList中,但是后来发现这个ListNode是自己写的,只能通过一个一个的判断.next 是否为空了,然后通过递归 或者  
循环  添加所有的元素
  1. /**
  2. * public class ListNode {
  3. * int val;
  4. * ListNode next = null;
  5. *
  6. * ListNode(int val) {
  7. * this.val = val;
  8. * }
  9. * }
  10. *
  11. */
  12. import java.util.ArrayList;
  13. public class Solution {
  14. ArrayList list = new ArrayList<Integer>();
  15. public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
  16. if(listNode!=null){
  17. this.printListFromTailToHead(listNode.next);
  18. list.add(listNode.val);
  19. }
  20. return list;
  21. }
  22. }

《剑指Offer 1.二维数组中的查找》2019-03-25的更多相关文章

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

    目录 题目 解题思路 具体代码 题目 题目链接 剑指offer:二维数组中的查找 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺 ...

  2. 剑指 Offer 04. 二维数组中的查找 (思维)

    剑指 Offer 04. 二维数组中的查找 题目链接 本题的解法是从矩阵的右上角开始寻找目标值. 根据矩阵的元素分布特性, 当目标值大于当前位置的值时将row行号++,因为此时目标值一定位于当前行的下 ...

  3. 《剑指offer》 二维数组中的查找

    本题目是<剑指offer>中的题目 二维数组中的查找 题目: 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个 ...

  4. 【Java】 剑指offer(3) 二维数组中的查找

    本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上 ...

  5. [剑指Offer]5.二维数组中的查找

    题目 在一个二维数组中,每一行都依照从左到右递增的顺序排序,每一列都依照从上到下递增的顺序排序.请完毕一个函数,输入这种一个二维数组和一个整数.推断数组中是否含有该整数. 思路 [算法系列之三十三]杨 ...

  6. Go语言实现:【剑指offer】二维数组中的查找

    该题目来源于牛客网<剑指offer>专题. 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一 ...

  7. 【剑指offer】二维数组中的查找

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

  8. 剑指Offer 1. 二维数组中的查找 (数组)

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

  9. 剑指offer(2) - 二维数组中的查找

    题目: 在一个二维数组中.每一行都依照从左到右递增的顺序排序,每一列都依照从上往下递增的顺序排序.请写一个函数,输入一个二维数组和一个整数,推断数组中是否含有该整数. 比如以下的二维数组就是每行.每列 ...

随机推荐

  1. Memento Mori (二维前缀和 + 枚举剪枝)

    枚举指的是枚举矩阵的上下界,然后根据p0, p1, p2的关系去找出另外的中间2个点.然后需要记忆化一些地方防止重复减少时间复杂度.这应该是最关键的一步优化时间,指的就是代码中to数组.然后就是子矩阵 ...

  2. jenkins1

    持续集成工具: Jenkins  和 Hudson是同源的. 甲骨文和开源社区之间的关系破裂,该项目被分成两个独立的项目. Jenkins:由大部分原始开发人员组成,Hudson:由甲骨文公司继续管理 ...

  3. Java 注释规范

    基本的要求: 1.注释形式统一 在整个应用程序中,使用具有一致的标点和结构的样式来构造注释.如果在其它项目中发现它们的注释规范与这份文档不同,按照这份规范写代码,不要试图在既成的规范系统中引入新的规范 ...

  4. The Little Prince-12/12

    The Little Prince-12/12 双十二,大家有没有买买买呢?宝宝双十一之后就吃土了,到现在,叶子都长出来了!!! 当你真的喜欢一个人的时候 就会想很多 会很容易办蠢事 说傻话 小王子要 ...

  5. IntelliJ IDEA的使用之调试方法

    不管学什么要及时复习和练习!!不然就会忘掉,有个输入输出的过程 IntelJ IDEA的使用之断点调试 1)添加断点:直接在代码的最左侧点一下就行,出现红色圈圈. 2)单步运行:mac中F7.F8有其 ...

  6. linux下nginx编译安装

    步骤: 1.获取nginx安装包. 进入nginx官网:http://nginx.org/ 找到稳定版本: 点击红框内的链接. 使用wget获取安装包. wget http://nginx.org/d ...

  7. Prometheus监控学习笔记之PromQL操作符

    0x00 二元运算符 Prometheus 的查询语言支持基本的逻辑运算和算术运算.对于两个瞬时向量, 匹配行为可以被改变. 算术二元运算符 在 Prometheus 系统中支持下面的二元算术运算符: ...

  8. Prometheus监控学习笔记之解读prometheus监控kubernetes的配置文件

    0x00 概述 Prometheus 是一个开源和社区驱动的监控&报警&时序数据库的项目.来源于谷歌BorgMon项目.现在最常见的Kubernetes容器管理系统中,通常会搭配Pro ...

  9. sublime text3 批量查找替换文件夹或项目中的字符

    1.点击左上角的“菜单”,在弹出的菜单中选择“打开文件夹”. 2.在文件夹上右击,选择“在文件夹中查找”选项 3.之后会软件底部会弹出对话框,分别输入要查找的内容和替换的内容,最后点击替换按钮 4.再 ...

  10. socket:10038错误

    转自:http://blog.csdn.net/chen495810242/article/details/42029825 winSock的一个bug:当closesocket多次错误使用时会导致问 ...