1
ivanlw 2013-04-28 13:58:55 +08:00
插入的地方的前后内容不可以直接判断吗?
|
3
Cadina 2013-04-28 14:15:35 +08:00
先遍历一遍字符串,记录下可以插入的点,然后从这些点中随机选一个。
我记得有个未知长度流中随机选取的算法,可以用来优化空间复杂度。 |
5
bitsmix 2013-04-28 14:31:54 +08:00 1
split(/\s/) .
|
6
lookhi 2013-04-28 14:38:16 +08:00 1
直接随即个地址,再检查能否插入。成功率还是很高的。
|
8
oldcai 2013-04-28 14:46:47 +08:00 1
1.随机一个字符串长度内的数字赋值给index,检查这个index位置的字符和index+1的字符是否为空格;
2.如果有空格,就记录这个随机数index到一个集合set,随机另外的index数值,并确保这个index不再set之中出现过,将此index带入1,重复第一步到重复次数==字符串长度; 3.没有空格,就在index后面插入;重复次数==字符串长度,则报错或者什么的,反正就是没地方可以插了。 |
11
astnd 2013-04-28 14:52:44 +08:00 1
1 随机Index 判断index和index+1中有没有空格
2 若无 插入 程序返回 3 若index是空格 index+1也是空格 将从index-1 index index+1 index+2排除 重复1 4 若index是空格 将从index-1 index index+1排除 重复1 5 若index是空格 将从index index+1 index+2排除 重复1 大概是这样 |
15
Cadina 2013-04-28 15:01:27 +08:00 1
LZ可以google一下“蓄水池抽样”这个问题,解法是类似的
|
16
touch 2013-04-28 15:29:17 +08:00
在已经知道字符串情况下插入的话 没什么要求直接replace。
|
17
Mutoo 2013-04-28 17:26:24 +08:00 1
给你一种思路找可以找到所有可以插入的位置(使用正则)
var str = "wkjkjd fsk fsdjk\nbbb sss fasdf"; var reg = new RegExp(/\w(?=\w)/g); reg.exec(str); // 搜索下一个可插入的位置 reg.lastIndex+1; // 可插入的位置 (可以不断重复) reg.exec(str); // 搜索下一个可插入的位置 reg.lastIndex+1; // 可插入的位置 参考资料 http://www.w3school.com.cn/js/jsref_exec_regexp.asp 至少你想在什么时候插入,可以用随机函数决定 |
18
oldcai 2013-04-28 18:12:09 +08:00 1
|
19
luikore 2013-04-28 21:34:33 +08:00 1
ruby 版完整代码 (这种问题正则里直接用非词界 \B 就可以):
s = "wkjkjd fsk fsdjk bbb sss fasdf" pos = rand s.scan(/\B/).count # 计算插入位置 s.gsub(/\B/){ pos -= 1 pos == -1 ? 'a' : '' } |
20
13m OP |
23
tioover 2013-04-28 21:47:47 +08:00 via Android
随机index 判断,不行的话再随机一个index。简单粗暴,不过最坏运行时间是无穷233
|
24
ipconfiger 2013-04-29 02:27:01 +08:00
import random
s = "wkjkjd fsk fsdjk bbb sss fasdf" def insert(s): if not s: return "a" idx = random.randint(0,len(s)-1) return "".join([s[0:idx],"a",s[idx:len(s)]]) result = " ".join(["".join([word[0],insert(word[1:-1]),word[-1]]) for word in s.split()]) |
26
ipconfiger 2013-04-29 02:31:21 +08:00 1
|
27
DeeCheung 2013-04-29 04:09:17 +08:00 1
'wkjkjd fsk fsdjk\nbbb sss fasdf'.replace(/(bbb|sss)(\s)?/g, function(match, p1, p2){
var min = 1, max = p1.length - 1, pos = Math.floor(Math.random() * (max - min + 1)) + min; //ranint return p1.substr(0, pos) + 'a' + p1.substr(pos, p1.length - 1) + p2; }); |
28
DeeCheung 2013-04-29 04:12:42 +08:00
|