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

2018-04-18 21:31:53 +08:00
 jingous

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

输入:华 hua 4

输出:华 hu

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

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

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

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

输入:hua 华 4

或者

输入:华 hua 5

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/447949

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX