class Solution {
public int numSub(String s) {
String[] sub=s.split("0");
long total=0;
long a=0;
for(int i=0;i<sub.length;i++){
a=(long)sub[i].length();
total=total+a*(a+1)/2;
}
return (int)(total%(1000000000+7));
}
}
上面是我看了论坛搞出来的最优解。还是远不如python,python如下
class Solution(object):
def numSub(self, s):
ones = s.split('0');
res = 0
for i in ones:
res += len(i) * (len(i)+1) / 2
return res % (10**9 + 7)
因为java有类型,而python无类型,所以在java需要很多显式的类型转换,特别烦躁。关键是长度函数还不一样。
String 是length(),数组是length,list是size(),这些细节都是会浪费分钟级别的时间。
次方人家python**结束,java要敲这么多个0,增加错误概率。
这是第一次我自己的答案,非常冗余,这个答案是不对的,关键是要把total和n的类型都改成long,不然在计算n*(n+1)/2的时候已经发生越界了。
int total=0;
int n=0;
for(int i=0;i<s.length();i++){
System.out.print("i="+i);
//
if(s.charAt(i)=='1'){
n=n+1;
System.out.print(",n="+n);
if(i==(s.length()-1))
{
total=total+n*(n+1)/2;
System.out.println(",total="+total);
return total;
}
}else{
total=total+n*(n+1)/2;
n=0;
System.out.println(",total="+total);
}
}
return total;