面试题:输入某个字符,相当于退格键(删除)

        输入某个字符,相当于退格键(删除),输入一个删除一个,输入一个删除一个。。。

行了,废话不多说了,直接上代码:

# 方法一:这是我原本的思路,运用了递归思想
function filterStr($str,$filter){
    $long = strlen($str);
    $u = array();
    for ($i=1; $i < $long; $i++) { 
        if ($str[$i] == $filter) {
            $u[] = $i;
        }
    }
    if (!empty($u)) {
        /*刚开始这里用的是explode,实际操作发现不行,查手册才知道是因为explode是用一个字符串去拆分
        另外一个字符串,分割字符是必填的;
        而str_split才是真正的拆分字符串,直接把字符串进行分割,第二个参数是分割长度,默认是1;*/
        $arr = str_split($str);
        foreach ($u as $key) {
            unset($arr[$key]);
            unsetPrev($key-1,$arr);
        }
    }
    return implode('', $arr);
}
# 这里用到了引用传值
function unsetPrev($k, &$arr){
    if ($k >= 0) {
        if (isset($arr[$k])) {
            unset($arr[$k]);
        }else{
            unsetPrev($k-1,$arr);
        }
    }
    return $arr;
}

# 方法二:这是经大佬点拨,运用了堆栈思想-->后进先出
function filterStr2($str,$filter){
    if (is_string($str) && !empty($str)) {
        $arr = str_split($str);
        $newArr = array();
        $filterArr = array();
        foreach ($arr as $key => $value) {
            if($value == $filter){
                array_pop($newArr);
            }else{
                array_push($newArr,$value);
            }
        }
        return implode('', $newArr);
    }
}

$url = 'https://pengxb.com/';
echo $url.'<br />';
print_r(filterStr($url,'m'));
echo  '<br />';
print_r(filterStr2($url,'m'));

结果

https://pengxb.com/
https://pengxb.c/
https://pengxb.c/

得到的结果是一样的,只是同样的结果,这代码量明显不一样/(ㄒoㄒ)/~~

写完之后发现自己有三个不足:

    一、explode用多了,泪奔中::>_<::...

    二、引用传值还是不太熟啊,第一次用错了,在调用的时候,是不需要带&符号的,丢。。。    

    三、要好好了解了解堆栈思想了,嗯。。。

技苑
请先登录后发表评论
  • 最新评论
  • 总共0条评论
  • © 2016-2024 技苑 | PHP是最好的语言 版权所有 ICP证:鄂ICP备15021999号-4
  • 联系邮箱:master@pengxb.com