【漫步计算机系统】之数据结构与算法(8):数组

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

算法描述:

  1. p1为字符串长度减1;

  2. 从字符串头字符遍历至尾字符,若有空格字符,则在字符串尾部添加两个字符;

  3. p2为操作后字符串的长度减1;

  4. p1为原字符串长度减1,将字符串从p1位置遍历至头字符,若该位置非空格,则将该位置字符复制至p2位置;若为空格,则在p2-2、p2-1、p2位置置为%20;

  5. 遍历运行至p1<0或p1==p2。

代码如下:

public String replaceSpace(StringBuffer str) {    int P1 = str.length() - 1;    for (int i = 0; i <= P1; i++)        if (str.charAt(i) == ' ')            str.append("  ");
    int P2 = str.length() - 1;    while (P1 >= 0 && P2 > P1) {        char c = str.charAt(P1--);        if (c == ' ') {            str.setCharAt(P2--, '0');            str.setCharAt(P2--, '2');            str.setCharAt(P2--, '%');        } else {            str.setCharAt(P2--, c);        }    }    return str.toString();}

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

Consider the following matrix:[  [1,   4,  7, 11, 15],  [2,   5,  8, 12, 19],  [3,   6,  9, 16, 22],  [10, 13, 14, 17, 24],  [18, 21, 23, 26, 30]]
Given target = 5, return true.Given target = 20, return false.

这个问题如果从第一行第一列元素着手,很难找到解决方案;如果从右上角元素开始,问题就迎刃而解了。

算法描述:

  1. 从右上角元素开始,如果目标元素小于该元素,则将游标向左移动一位;如果目标元素大于该元素,则将游标向下移动一位;如果相等,则返回true;

  2. 迭代;

  3. 如果遍历整个二维数组均找不到和目标元素相等的元素,则返回false。

代码如下:

public boolean Find(int target, int[][] matrix) {    if (matrix == null || matrix.length == 0 || matrix[0].length == 0)        return false;    int rows = matrix.length, cols = matrix[0].length;    int r = 0, c = cols - 1; // 从右上角开始    while (r <= rows - 1 && c >= 0) {        if (target == matrix[r][c])            return true;        else if (target > matrix[r][c])            r++;        else            c--;    }    return false;}

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

Input: abaccOutput: b

算法描述:

  1. 创建一个有128元素(代表128个ASCII 码字符)的整型空数组cnts;

  2. 遍历字符串,将字符串的每个字符对应的ASCII值作为cnts的下标,该下标的值每次加1;

  3. 从头至尾遍历数组cnts,找到值为1的元素,返回该元素在字符串中的位置。如找不到,返回-1。

代码如下:

public int FirstNotRepeatingChar(String str) {    int[] cnts = new int[128];    for (int i = 0; i < str.length(); i++)        cnts[str.charAt(i)]++;    for (int i = 0; i < str.length(); i++)        if (cnts[str.charAt(i)] == 1)            return i;    return -1;}

注:凡属于本公众号内容,未经允许不得私自转载,否则将依法追究侵权责任。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HIT_USTC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值