面试时遇到的一道算法题

2018-03-18 21:26:59 +08:00
 abusizhishen

写算法实现从字符串中提取整数。
如 'a1b2c3d4'需要提取为 1234,这里的 1234 是整数不是字符串 要求:
1.不能有隐式类型转换。
2.尽可能优化。

3.延伸思考,如果提取出的数字超过最大值怎么办?如最大为 123,超过这个数时如何处理?

4815 次点击
所在节点    算法
39 条回复
abusizhishen
2018-03-19 08:27:34 +08:00
@pkookp8 隐式转换哦
geelaw
2018-03-19 08:29:18 +08:00
@geelaw 呃……显然我的意思是 if (ch >= '0' && ch < '0' + 10) 才对
MeteorCat
2018-03-19 08:33:57 +08:00
ASCII 判断一下就行了
MeteorCat
2018-03-19 08:38:36 +08:00
muduo 库里面有个字符串转数字的方法,你看下是不是这样
https://github.com/chenshuo/muduo/blob/master/muduo/base/LogStream.cc
abusizhishen
2018-03-19 08:39:09 +08:00
@geelaw 没看懂😂
abusizhishen
2018-03-19 08:39:23 +08:00
abusizhishen
2018-03-19 08:41:43 +08:00
预定义一个数组
abusizhishen
2018-03-19 08:46:02 +08:00
$arr=["0"=>0,"1"=>1,"2"=>2,...]
array_key_exists()
markx
2018-03-19 08:47:08 +08:00
不能隐式类型转换, 可以显式转换?
binux
2018-03-19 08:52:37 +08:00
@abusizhishen 这不叫算法题,这叫猜猜看我想什么。
lhx2008
2018-03-19 08:55:14 +08:00
@binux 脱了裤子放屁哈哈,增加空间复杂度时间复杂度
ctro15547
2018-03-19 09:12:02 +08:00
#python
s = 'a1a2a3a4'
i = int(''.join(filter(lambda k: k.isdigit(),list(s))))
print i
#1234

延伸 3,如果只比 123 小就输出的话,写个判断 大于 123 的 除以 100,即 12.34 ,19.37 这种

还可以先排个序,输出:范围内最大或最小的数,43.21 ,97.31

是我理解错了吗,总感觉前面讨论的我都听不懂。。。
bzw875
2018-03-19 10:09:56 +08:00
'a1b2c3d4'.replace(/[^\d]/g, '')
i_have_to_pee
2018-03-19 13:36:48 +08:00
楼主这么萌,你们不要欺负他。
Bryan0Z
2018-03-19 13:44:33 +08:00
讲道理,两个 for 循环搞定啊…像我大一时候做的题目
SourceMan
2018-03-19 13:51:04 +08:00
这不是算法题
这叫:茴香豆的茴有几种写法
Kisesy
2018-03-19 13:53:25 +08:00
看起来简单的问题,实际上非常难,因为限制了隐式类型转换,而不少语言,从字符串里取元素时,会隐式转成整数,所以连字符串遍历都不能写,就别说实现了(滑稽
snowonion
2018-03-22 23:49:01 +08:00
-- Haskell (GHC 8.2.2)
-- 使用了尽量初级的语言特性……

extractInt :: String -> Int
extractInt str = strToInt (filter isDigit str)

strToInt :: String -> Int
strToInt str = sum ( zipWith (*) (map (10^) [0..]) (reverse (strToDigits str) ) )

strToDigits :: String -> [Int]
strToDigits str = map (subtract (fromEnum '0') . fromEnum) str

isDigit :: Char -> Bool
isDigit ch = fromEnum '0' <= ascii && ascii <= fromEnum '9' where
ascii = fromEnum ch

>> 如果提取出的数字超过最大值怎么办?如最大为 123,超过这个数时如何处理?

你想处理成什么样?
(注意不是“你想怎么处理”)
snowonion
2018-03-22 23:51:25 +08:00
Oi,为什么程序员聚居的 V2EX 吃缩进这么熟练啊! Try:
```
isDigit :: Char -> Bool
isDigit ch = fromEnum '0' <= ascii && ascii <= fromEnum '9' where
ascii = fromEnum ch
```
这里有两个空格缩进 ascii = fromEnum ch

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

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

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

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

© 2021 V2EX