Java数组与矩阵算法题-00

重复数字

在一个长度为 n 的数组里的所有数字都在 0 到 n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每个数字重复几次。请找出数组中任意一个重复的数字。

  1. HashMap,map.containsKey(x),如果为true,代表数据重复
  2. HashSet特性,set.add(x),如果为false,代表数据重复。
  3. 优解O(n),O(1)。
    每个数字都放到其对应下标下,如果对应下标下的值与自己相同,说明重复。

https://www.nowcoder.com/practice/6fe361ede7e54db1b84adc81d09d8524?tpId=13&tqId=11203&tab=answerKey&from=cyc_github


二维数组中的查找

给定一个二维数组,其每一行从左到右递增排序,从上到下也是递增排序。给定一个数,判断这个数是否在该二维数组中。

  • 先对数据组的合理性进行判断
  1. 从左上开始遍历,依次减少一行或者一列的范围。

https://www.nowcoder.com/practice/abc3fe2ce8e146608e868a70efebf62e?tpId=13&tqId=11154&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking&from=cyc_github


替换空格

将一个字符串中的空格替换成 "%20"。

  1. 用StringBuilder直接.append('%20')
  2. 优解
    先用.charAt==(i) ' '判断有几个空格,在字符串末尾加上空格个数*2的字符串大小。用于后续存储3个字符中的2个字符空间。
    p1指向原字符串末尾,p2指向现字符串末尾。
    依次向前遍历,不是空格p2复制p1,是空格,依次插入02%。直到遍历结束

https://www.nowcoder.com/practice/0e26e5551f2b489b9f58bc83aa4b6c68?tpId=13&tqId=11155&tab=answerKey&from=cyc_github


顺时针打印矩阵

按顺时针的方向,从外到里打印矩阵的值。

  1. 确定矩阵的四个边界,然后循环输出。将边界缩小,重复上述过程。

https://www.nowcoder.com/practice/9b4c81a02cd34f76be2659fa0d54342a?tpId=13&tqId=11172&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking&from=cyc_github


第一个只出现一次的字符位置

在一个字符串中找到第一个只出现一次的字符,并返回它的位置。字符串只包含 ASCII 码字符。

  1. HashMap
  2. 用int数组代替HashMap,.charAt(i)作为下标
  3. 优解 统计3种情况,可以用2位二进制处理,即2个Byte存储出现的个数。
    BitSet bs1 = new BitSet(128);
    !bs1.get(c) && !bs2.get(c) 未出现过
    bs1.get(c) && !bs2.get(c) 出现过一次
    bs1.set(c); 设置为1,表示出现过了

https://www.nowcoder.com/practice/1c82e8cf713b4bbeb2a5b31cf5b0417c?tpId=13&tqId=11187&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking&from=cyc_github


引用仓库:https://github.com/CyC2018/CS-Notes/blob/master/notes/%E5%89%91%E6%8C%87%20Offer%20%E9%A2%98%E8%A7%A3%20-%20%E7%9B%AE%E5%BD%95.md

你可能感兴趣的:(Java数组与矩阵算法题-00)