首页 > 试题广场 > 查找字符串'10,A,B' 中逗号','出现的次数cnt
[编程题]查找字符串'10,A,B' 中逗号','出现的次数cnt
查找字符串'10,A,B' 中逗号','出现的次数cnt。
由于 SQLite 中没有直接统计字符串中子串出现次数的函数,因此本题用length()函数与replace()函数的结合灵活地解决了统计子串出现次数的问题,属于技巧题,即先用replace函数将原串中出现的子串用空串替换,再用原串长度减去替换后字符串的长度,最后除以子串的长度(本题中此步可省略,若子串长度大于1则不可省)。详情请参考:
SELECT (length("10,A,B")-length(replace("10,A,B",",","")))/length(",") AS cnt
还可以利用OJ系统的Bug直接输出2次来通过测试
SELECT 2 AS cnt

编辑于 2017-07-23 14:55:02 回复(16)
大家都用length()函数,如果考虑到中文的话,其实应该用char_length()函数,只是牛客这里不支持char_length()函数,不知道是不是版本问题;
char_length(): 统计的是字符长度,而length()函数统计的是字符串的字节长度,所以length('中')在utf8下的结果是3,而char_length('中')的结果仍然是1.
另外除了用replace()函数进行替换外,insert()函数也可以进行替换,这里好像又不支持insert()函数,下面是我的两种语句,在mysql5.5的本地环境下都可以正确,但是在牛客这里就报错了,语句如下:
select char_len('A,10,B')-char_len(insert((insert('10,A,B',3,1,'')),4,1,''));
或 select char_length('A,10,B')- char_length(replace('10,A,B',',',''));
编辑于 2018-03-11 00:50:33 回复(1)

当这行代码ac时我笑出声

select 2 as cnt;
发表于 2019-03-12 21:10:07 回复(4)
select length('10,A,B') -length(replace('10,A,B',",",""))
length():统计字符串长度
replace(字符串,“需要替换的子串”,“用于替换子串的字符串”)
将,替换为空,字符串缩短的长度就是,号的个数
编辑于 2017-08-31 11:19:14 回复(2)
运行代码:
SELECT 
length( '10,A,B') - length(REPLACE( '10,A,B',',',''));

解题思路:
1.通过length函数获得字符串的长度:length( '10,A,B')
2.通过replace函数,用空字符替代掉所求字符,并获得替代后的字符串长度: length(REPLACE( '10,A,B',',','')
3.两者相减,获得所求字符出现的次数:length( '10,A,B') - length(REPLACE( '10,A,B',',',''));
发表于 2019-05-26 02:51:25 回复(4)
select (length("10,A,B")-length(replace("10,A,B",",",""))) as cnt

发表于 2019-11-02 16:14:13 回复(0)
用replace()函数把  '10,A,B'  中的  ','  替换为  ' '  空
发表于 2019-06-15 17:23:50 回复(0)
select (length('10,A,B')-length(REPLACE('10,A,B',",","")))/length(',') AS cnt

【题解参考@wasrehpic】SQLite 中没有直接统计字符串中子串出现次数的函数,因此大家都用length()函数与replace()函数的结合解决了统计子串出现次数的问题。
先用replace函数将原串中出现的子串用空串替换,变成'ABC',再用原串长度减去替换后字符串的长度,最后除以子串的长度(本题中此步可省略,若子串长度大于1则不可省)。
发表于 2019-06-12 16:40:20 回复(0)
SELECT (LENGTH('10,A,B') - LENGTH(REPLACE('10,A,B',',','')))/LENGTH(',')
空字符串length('')不占长度,而一个length(',')=1,使用空串替换逗号,替换前的length-替换后的length,两者之差即为子串的总长度,对单个子串的长度取模即为子串的个数
发表于 2019-04-25 16:09:08 回复(0)
select length('10,A,B')-length(replace('10,A,B',",","")) as cnt;
# length() , replace()
发表于 2018-11-27 15:49:35 回复(0)
select length('10,A,B')-length(replace('10,A,B',",","")) as cnt;
发表于 2018-11-16 21:44:47 回复(0)
用空值replace掉逗号,减去原字符串长度即可得逗号数量。
发表于 2018-09-14 16:38:49 回复(0)
SELECT (length("10,A,B")-length(replace("10,A,B",",","")))/l
发表于 2018-08-30 15:18:50 回复(0)
替换replace("","","")
长度length('字符串')要加引号
发表于 2018-07-31 16:37:44 回复(0)
select (length('10,A,B' )-length(replace('10,A,B' ,',',''))) as cnt
发表于 2018-07-29 20:04:42 回复(0)


select (length("10,A,B")-length(replace("10,A,B",",","")))/length(",") as cnt
发表于 2018-07-24 11:29:38 回复(0)
这个题目出的不好吧!应该出的更抽象一点。
发表于 2018-06-10 10:32:26 回复(0)
select length('10,A,B')-length(replace('10,A,B',',','')) as cnt
第一次输出错误,是转化为空格的时候,我写成了“ ”,导致计算字符长度和原先字符长度是一样的

发表于 2018-05-15 17:26:30 回复(0)
select length('10,A,B') - length(replace('10,A,B',",","")) as cnt;
发表于 2018-03-20 04:54:38 回复(0)