V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jingous
V2EX  ›  职场话题

华为机试的一道签到题,总是过不了

  •  
  •   jingous · 2018-04-18 21:31:53 +08:00 · 4201 次点击
    这是一个创建于 2402 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在 GBK 编码下,请编写一个截取字符串的函数, 输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个,同时忽略字符串中的数字后输出最终结果。 给定样例:

    输入:华 hua 4

    输出:华 hu

    以下是我的代码(通过 20%),周围没有发现完全过的。 https://pan.baidu.com/s/1FHWgcyJOZ3agPQBopduqJg

    由于不清楚是否是先忽略数字再截取,还是先截取然后输出的时候忽略数字。我两种都有测试,但依旧过不了。想请教一下,我哪种情况没考虑?

    16 条回复    2018-04-19 19:46:01 +08:00
    jingous
        1
    jingous  
    OP
       2018-04-18 21:34:10 +08:00
    还有一份通过率 40%的代码,但修改不见了。
    l00t
        2
    l00t  
       2018-04-18 21:43:28 +08:00
    你这代码里哪个地方体现了对 GBK 的处理?
    jingous
        3
    jingous  
    OP
       2018-04-18 21:56:07 +08:00
    @l00t 这不是已经告诉你环境是 GBK 了么,然后我签到题的考点就是中文字符 gbk 两个字节。

    难道是:他的测试环境不一定是 gbk 编码,而是需要显示的将编码转换为 gbk?
    l00t
        4
    l00t  
       2018-04-18 22:02:58 +08:00
    @jingous #3 GBK 两个字节,然后要求你不要截出半个来,所以你的处理就是看字符串去掉数字后的实际长度与输入的字节数的最小值是奇数还是偶数?

    输入:hua 华 4

    或者

    输入:华 hua 5

    请问输出是什么?
    l00t
        5
    l00t  
       2018-04-18 22:03:49 +08:00
    V 站英文和汉字间会自动加空格,请忽略中间的空格。
    jingous
        6
    jingous  
    OP
       2018-04-18 22:13:31 +08:00
    @l00t 题目模糊不清。我理解的是
    输入:hua 华 4
    输出:hua
    输入:hua 华 5
    输出:hua 华
    因为是两个两个字节,并且每个字节都小于 0.所以,我判断,如果截取的字符串中小于 0 的符号是奇数个,说明汉字被截断了。
    jingous
        7
    jingous  
    OP
       2018-04-18 22:18:05 +08:00
    @l00t 目前没有找到一个通过的代码,因此看是否是我漏掉了什么。我感觉是没有显示转换 gbk 的问题。但机试结束,没办法测试了
    l00t
        8
    l00t  
       2018-04-18 22:20:12 +08:00
    @jingous #6 什么是“字节小于 0 ” 和 “小于 0 的符号” ? 我不明白你的概念……
    jingous
        9
    jingous  
    OP
       2018-04-18 22:22:02 +08:00
    @l00t 一个汉字的大小是两个字节,这两个值都是 1 开头的。只要判断字符串中有几个字符小于 0,就可以统计处字符串中的汉字个数
    l00t
        10
    l00t  
       2018-04-18 22:29:15 +08:00
    @jingous #9 你还是举个例子吧,比如哪个字符小于 0,不然真心无法理解。
    jingous
        11
    jingous  
    OP
       2018-04-18 22:35:42 +08:00
    @l00t 比如输入:华 1
    该字符串长度为 2,其中每个字符都是<0。那么子字符串中小于 0 的字符有 1 歌(奇数),说明把汉字截断了。于是不再输出截断的汉字。最后结果输出为空。
    zmj1316
        12
    zmj1316  
       2018-04-18 22:36:34 +08:00 via Android
    和四舍五入类似,不截断是不是要求保留而不是去掉
    katsusan
        13
    katsusan  
       2018-04-18 22:56:29 +08:00 via iPhone
    GBK 亦采用双字节表示,总体编码范围为 8140-FEFE,首字节在 81-FE 之间,尾字节在 40-FE 之间。
    > 第二个字节不一定小于 0 吧
    l00t
        14
    l00t  
       2018-04-18 23:18:03 +08:00
    @jingous #11 我懂你的意思了,你是按补码的思路。
    UIXX
        15
    UIXX  
       2018-04-19 08:57:19 +08:00
    讲个个人思路,把字符串跟字节数组进行同字节数据比较可能更简单点
    Zhuozhuo
        16
    Zhuozhuo  
       2018-04-19 19:46:01 +08:00
    可能也是有个隐藏的 case,有一个其他的汉字或者中文标点啥的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4088 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 10:15 · PVG 18:15 · LAX 02:15 · JFK 05:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.