题目描述:
示例
解题思路:
1、这道题一开始我使用的是暴力求的,两层for循环,计数,但是超时了。
2、正确的方法,把字符串按 “0” 进行分割,然后得到一个字符串数组,假设str="1"按照题目的描述,符合条件的n=1
str=“11” n=3
str=“111” n=6
str=“1111” n=10
这样发现了一个规律,1的个数k (k*(k+1))/2就是符合条件的次数n。
参考代码:
//AC代码
public static int find(String s){
long l= (long) Math.pow(10,9)+7;
long sum=0;
String[] str=s.split("0");
for (int i=0;i<str.length;i++){
long n=str[i].length();
sum+=(n*(n-1)/2+n)%l;
}
return (int) sum;
}
//这种做法会超时
public static int find2(String s){
long sum=0;
String str="";
long l= (long) Math.pow(10,9)+7;
char[] c=s.toCharArray();
for (int i = 0; i < c.length; i++) {
str=String.valueOf(c[i]);
if(str.equals("1"))
sum++;
if(!str.equals("0")){
for (int j = i+1; j < c.length; j++) {
str+=String.valueOf(c[j]);
if(!str.contains("0"))
{
sum++;
sum=sum%l;
}
}
}
}
return (int) sum;
}