剑指Offer笔记—— 二维数组中的查找 替换空格

来源:互联网 发布:相机数据恢复 编辑:程序博客网 时间:2024/06/08 20:02

1、面试题3:二维数组中的查找

题目大致为:

    一个二维数组,每一行按照从左到右递增,每一列按照从上到下递增,查找数组中是否存在某个数。如数组:

1  2  8    9

2  4  9   12

4  7  10  13

6  8  11  15

思路:

    这道题有其特殊性,从右上角或者左下角开始查找的方向是确定的。这句话是说比如是查找7,我们从右上角开始,9大于7,则减少列下标,查找13的话就增加行下表,查找的方向是确定的,这样就容易实现了。

Java代码:

[java] view plain copy
  1. package org.algorithm.pointtooffer;  
  2.   
  3. /** 
  4.  * 面试题3:二维数组的查找 
  5.  *  
  6.  * @author dell 
  7.  *  
  8.  */  
  9. public class Item03 {  
  10.     public static void main(String args[]) {  
  11.         // 测试用的例子  
  12.         int A[][] = { { 1289 }, { 24912 }, { 471013 },  
  13.                 { 681115 } };  
  14.         System.out.println(find(A, 7));  
  15.     }  
  16.       
  17.     /** 
  18.      * 二维数组的查找 
  19.      * @param array 已知的数组 
  20.      * @param number 待查找的数 
  21.      * @return 
  22.      */  
  23.     public static boolean find(int array[][], int number) {  
  24.         boolean flag = false;  
  25.         int rows = array.length;// 行数  
  26.         int columns = array[0].length;// 列数  
  27.         int row = 0;  
  28.         int column = columns - 1;  
  29.         while (row < rows && column >= 0) {  
  30.             // 比较二维数组中的元素与number的关系  
  31.             if (array[row][column] == number) {  
  32.                 flag = true;  
  33.                 break;// 跳出循环  
  34.             } else if (array[row][column] > number) {  
  35.                 // 列变小  
  36.                 column--;  
  37.             } else {  
  38.                 // 行变大  
  39.                 row++;  
  40.             }  
  41.         }  
  42.         return flag;  
  43.     }  
  44. }  


2、面试题4:替换空格

题目大致为:

    实现一个函数,把字符串中的每个空格替换成"%20"。

思路:

    在Java和C中,对字符串的处理略有不同,在C中字符串是以字符数组的形式存储的,并且在字符串或者字符数组中都有一个结束符"\0";而在Java中,却没有这样的结束符,所以本题在Java下的处理与C中也不一样。

    在C中,思路为:先遍历一遍,找到空格的个数,这样便可以计算新的字符串的长度=旧的字符串的长度+空格数*2,然后从尾部向前遍历,遇到非空格,则复制到新的位置,否则直接添加新字符。

    在Java中,字符替换主要有两种:replace(char oldChar, char newChar)replaceAll(String regex, String replacement)。

为简单起见,我加了点限制条件,用Java实现本题。

Java实现

[java] view plain copy
  1. package org.algorithm.pointtooffer;  
  2.   
  3. /** 
  4.  * 面试题4:替换空格 
  5.  *  
  6.  * @author dell 
  7.  *  
  8.  */  
  9. public class Item04 {  
  10.     public static void main(String args[]) {  
  11.         String s = "We are happy.";  
  12.         char c_old[] = s.toCharArray();  
  13.         // 为简单起见,我们假设给它一个新的空间,空间的大小组以存下替换后的字符  
  14.         char c_new[] = new char[100];  
  15.         for (int i = 0; i < c_old.length; i++) {  
  16.             c_new[i] = c_old[i];  
  17.         }  
  18.   
  19.         // 输出新的数组  
  20.         System.out.println(replaceBlank(c_new, c_old.length));  
  21.     }  
  22.       
  23.     /** 
  24.      * 计算新的字符串 
  25.      * @param c带空格的字符数组 
  26.      * @param length是指第一个字符到最后一个字符的长度,不是字符数组的长度 
  27.      * @return 
  28.      */  
  29.     public static String replaceBlank(char c[], int length) {  
  30.         // 查找空格的数目  
  31.         int blank = 0;  
  32.         for (int i = 0; i < length; i++) {  
  33.             if (c[i] == ' ') {  
  34.                 blank++;  
  35.             }  
  36.         }  
  37.   
  38.         // 重新计算新的数组的大小  
  39.         int length_new = length + blank * 2;  
  40.   
  41.         // 从尾到头查找  
  42.         int j = length - 1;  
  43.         int k = length_new - 1;  
  44.         while (j >= 0 && k >= 0) {  
  45.             if (c[j] != ' ') {  
  46.                 c[k--] = c[j];  
  47.             } else {  
  48.                 c[k--] = '0';  
  49.                 c[k--] = '2';  
  50.                 c[k--] = '%';  
  51.             }  
  52.             j--;  
  53.         }  
  54.         return new String(c);  
  55.     }  
  56. }  
原创粉丝点击