Unity - A计划(永久有效期) 扫二维码继续学习 二维码时效为半小时

(196评价)
价格: 4039.00元
关于数据结构课程的练习题(404课时)
sdewqazxcds发起了问答2017-09-25
7
回复
424
浏览

老师你留下了关于自定义一个Replace方法的一个坑,我可能有点强迫症,不填完这个坑就看不下去了,但是我自己能力有限,感觉把自己赶死胡同里了

问题是这里的问题:

 

我的代码:

public StringDS Replace(StringDS str, String Restr)
        {
            bool isEnd = true;
            string olddata=new string(this.data);
            string newdata = "";
            int len = Restr.Length;
            while (isEnd)
            {
                int index = olddata.IndexOf(new string(str));
                if (index != -1)
                {
                    Console.WriteLine(index + str.GetLength());
                    for (int i = 0; i < index; i++)
                    {
                        newdata += olddata[i];
                    }
                    newdata += Restr;
                    for (int i = olddata.Length; i >= index + str.GetLength()-1; i--)
                    {
                        olddata[i] = olddata[i - (index + str.GetLength())]; //这一行报错了,olddata下标越界
                    }
                }
                else
                {
                    isEnd = false;
                }
            }
            return new StringDS(newdata);
        }

这段代码的思路是这样的,我把olddata(即被替代的字符串)的前半段(即被替换的字符串的前面)放到一个新的字符串newdata里,然后把被替换的字符串也加到新的字符串里。然后olddata就把被替换掉的前面部分去掉,只留下未被替换的部分,如此循环,直到找不到需要被替换的字符串为止。思路是这样,但是操作起来,就很容易olddata数组下标越界,因为元素不固定,所以我就迷茫了……

 

PS:希望可以给提问区加一个搜索功能,便于查找以前同类的问题

所有回复
  • siki 2017-09-25
     for (int i = olddata.Length; i >= index + str.GetLength()-1; i--)
                        {
                            olddata[i] = olddata[i - (index + str.GetLength())]; //这一行报错了,olddata下标越界
                        }

    修改为

    string temp ="";

     for (int i = index+str.GetLength();i<olddata.length ; i++)
    {
           temp += olddata[i]; 
    }

    olddata=temp

     

    注意olddata是string不能修改单个字符的

     

    还有-4条回复,点击查看
    你还没有登录,请先登录注册
  • sdewqazxcds 2017-09-25
    public StringDS Replace(StringDS str, String Restr)
            {
                bool isEnd = true;
                string olddata = new string(this.data);
                string newdata = "";
                int len = Restr.Length;
                while (isEnd)
                {
                    int index = olddata.IndexOf(str.ToString());
                    if (index != -1)
                    {
                        for (int i = 0; i < index; i++)
                        {
                            newdata += olddata[i];
                        }
                        newdata += Restr;
                        string temp = "";//装载新字符串的临时变量(olddata是引用类型,不可修改)
                        for (int i = index+str.GetLength(); i < olddata.Length; i++)
                        {
                            temp += olddata[i];
                        }
                        olddata = temp;
                    }
                    else
                    {
                        newdata += olddata;
                        isEnd = false;
                    }
                }
                return new StringDS(newdata);
            }

    不过还有点bug,替换之后没加上剩下的字符串,所以需要在最后的时候加上

     

    测试结果:

    StringDS s = new StringDS("I am a teacher,teacher");
    Console.WriteLine(s.Replace(new StringDS("tea"), "cell").ToString());

    还有-5条回复,点击查看
    你还没有登录,请先登录注册
  • sdhexu 2017-09-26

    我还是没有忍住,吐槽一下哈。siki老师不要批评我。

    其实,楼主应该去研究研究字符串匹配算法,当然,这些算法大都是C++描述的,但着不影响理解算法本身的意义,语言只是工具而已。

    经典的字符串匹配算法有:朴素的遍历算法(你这个就是);Rabin-Karp算法(改进的朴素算法);有穷自动机算法(很容易构建词法分析器);Kmp算法(效率最高的算法,没有之一,当然理解起来最费劲。有很多针对KMP基本思路的改进)

    另外再说一点,这些算法,都是有底层API的,你直接调用就行了。你自己写的方法,可能会有效率问题、安全问题、小BUG等等。。。何必要再造轮子呢??用系统大神造好的不锈钢轮子,不比用你自己造的木头轮子好么。

     

    • sdhexu 2017-09-26

      比如:
      http://dsqiu.iteye.com/blog/1700312

      (0) 回复
    • sdewqazxcds 2017-09-26

      回复 @ sdhexu: 大佬,我写这代码前,没看过什么算法,什么解题思路,都是自己想的,难免会有纰漏。再说,先实现了再谈优化(我也知道while嵌套for循环时间复杂度很高)

      (0) 回复
    还有-3条回复,点击查看
    你还没有登录,请先登录注册
  • siki 2017-09-28

     这个其实不是写什么新的算法,或者更优的算法,人家也是练习编程

    开发的是肯定还是直接调用API

    还有-5条回复,点击查看
    你还没有登录,请先登录注册
发表回复
你还没有登录,请先 登录或 注册!