51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1810|回复: 4
打印 上一主题 下一主题

[讨论] 请教一个面试中的算法题

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2017-6-28 11:50:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一年在面试里被问了一个算法,当时思路很乱,很快就被面试官打断了。
一直念念不忘,现在正好在整理知识框架,把这个写了下,跟大家讨论下,是否这个思路是合理的,是否有补充。
题目:

写一段程序,删除字符串a中包含的字符串b,举例 输入a = "asdw",b = "sd" 返回 字符串 “aw”,并且测试这个程序。

  1. def delInnerString(string, targtString):
  2.     '''
  3.     去除String字符串中的targtString片段,返回去除后的字符串
  4.     :param String: 原始字符串
  5.     :param tagetString: 待删除片段
  6.     :return: result
  7.     '''
  8.     if not isinstance(string,str):
  9.         raise TypeError("string is not a str.")
  10.     if not isinstance(targtString,str):
  11.         raise TypeError("targtString is not a str.")
  12.     if len(string) < len(targtString):
  13.         raise Exception('targtString lenght must large to string lenght.')
  14.     result = []
  15.     flag = False # 标志是否匹配到targtString
  16.     i = 0
  17.     tag = -1 # 记录匹配到后,截取的位置
  18.     while i < len(string):
  19.         j = 0
  20.         while j < len(targtString):
  21.             if i+j < len(string) and string[i+j] == targtString[j]:
  22.                 j += 1
  23.             else:
  24.                 j += 1
  25.                 flag = False
  26.                 break
  27.             flag = True
  28.         if flag:
  29.             tag = i+len(targtString)
  30.         if i >= tag:
  31.             result.append(string[i])
  32.         i += 1
  33.     return "".join(result)
复制代码

如何测试这段代码,我画了个思维导图:

附用例代码段
  1. #a匹配不到b
  2. assert delInnerString('', '') == ''
  3. assert delInnerString('a', '') == 'a'
  4. assert delInnerString('ab', '') == 'ab'

  5. #a匹配到b部分一次
  6. assert delInnerString('ab', 'ac') == 'ab'
  7. assert delInnerString('cab', 'ac') == 'cab'
  8. assert delInnerString('ba', 'ac') == 'ba'

  9. #a匹配到b部分一次后,成功匹配到b

  10. assert delInnerString('acab', 'ab') == 'ac'
  11. assert delInnerString('aab', 'ab') == 'a'

  12. #a完整匹配到b一次
  13. assert delInnerString('a', 'a') == ''
  14. assert delInnerString('ab', 'ab') == ''
  15. assert delInnerString('bab', 'ab') == 'b'
  16. assert delInnerString('babc', 'ab') == 'bc'

  17. #a匹配到b一次,第二次部分匹配到b
  18. assert delInnerString('aba', 'ab') == 'a'
  19. assert delInnerString('abca', 'ab') == 'ca'
  20. assert delInnerString('caba', 'ab') == 'ca'
  21. assert delInnerString('cabca', 'ab') == 'cca'

  22. #a匹配到b多次
  23. assert delInnerString('aaaaaaaa', 'a') == ''
  24. assert delInnerString('abababababab', 'ab') == ''
  25. assert delInnerString('aaaabaaaa', 'a') == 'b'
  26. assert delInnerString('baaaaaaaa', 'a') == 'b'
  27. assert delInnerString('aaaaaaaab', 'a') == 'b'

  28. #随机测试
  29. assert delInnerString('asdwwdaaa', 'wd') == 'asdwaaa'
  30. assert delInnerString('123d2e231', '0') == '123d2e231'
  31. assert delInnerString('测试000', '测试') == '000'
  32. assert delInnerString('\n', '') == '\n'
  33. # 有重叠
  34. assert delInnerString('ababa', 'aba') == ''
  35. assert delInnerString('ccababacc', 'aba') == 'cccc'
  36. assert delInnerString('abcabca', 'abca') == ''

  37. # 一次截取后仍然包含目标字段
  38. assert delInnerString('aabb','ab') == ''
复制代码





分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏
回复

使用道具 举报

  • TA的每日心情
    无聊
    2024-7-12 13:16
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]测试小兵

    2#
    发表于 2017-6-28 15:49:22 | 只看该作者
    &#128514; 讲真这个题目如果真实要用,我就直接一句解决了

    1. “”.join(string.split(targetString))
    复制代码
    但是,面试这样会不太讨巧了吧?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    前天 09:07
  • 签到天数: 11 天

    连续签到: 2 天

    [LV.3]测试连长

    3#
    发表于 2017-6-28 15:49:52 | 只看该作者
    感觉代码还不够优雅
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    4#
    发表于 2017-6-28 15:50:55 | 只看该作者
    前面异常判断是加分项,而后面的if else就太啰嗦了。可以用indexOf来获取其实位置,然后substring就完事了
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    1720761397
  • 签到天数: 1 天

    连续签到: 1 天

    5#
    发表于 2017-6-28 15:51:29 | 只看该作者
    如果是 ababa aba
    这种特殊情况呢,还需要确认顺序匹配还是倒序匹配
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-9-21 05:39 , Processed in 0.074112 second(s), 22 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表