java - 检查双整数子串的更快方法

标签 java

我得到了一个大整数(位数最多可达 300000)。我应该找出整数的多少个子串可以被 4 整除。 我的代码很慢。任何使它更快的建议都值得赞赏。

public static void solve() throws IOException {
  String s = (new BufferedReader (new InputStreamReader (System.in))).readLine();
  int l = s.length(), d = 0; // d is number of substrings divisible by 4
  BigInteger f = new BigInteger("4");
  for(int i = 0; i < l; i++) {
    for(int j = i + 1; j <= l; j++) {
      String te = (s.substring(i,j)).replaceFirst("^0+(?!$)", ""); //regex used for leading zeros
      if( te.charAt(te.length()-1) == '3' || te.charAt(te.length()-1) == '5' || te.charAt(te.length()-1) == '7' || te.charAt(te.length()-1) == '9' )
        continue;
      else {
        BigInteger temp = new BigInteger(te);
        if ( (temp.mod(f)).toString().equals("0") )
          d++;
      }
    }
   }
  System.out.println( d );
}

最佳答案

如果一个整数可以被 4 整除,则该数小于 10 且以 0、4 或 8 结尾;或最后两位数能被 4 整除。

如果字符串的第一个字符本身可以被四整除,那么它就是您要计算的子字符串之一。

如果这对可被四整除的数字出现在位置 i-1i在字符串中,则有i + 1如果数字以偶数开头,则带有该后缀的子串,以及 i如果数字以奇数开头,则为子字符串。

因此,您可以按如下方式计算可被 4 整除的子串的数量:

int v = 0;
long cnt = 0;
for (int i = 0; i < s.length(); ++i) {
  int w = Character.digit(s.charAt(i), 10);
  if ((v * 10 + w) % 4 == 0) {
    cnt += i;
  }
  if (w % 4 == 0) {
    ++cnt;
  }
  v = w;
}

关于java - 检查双整数子串的更快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35522081/

相关文章:

java - 我可以对 subscribeOn 方法和异步任务使用相同的执行器吗

Java 从 SQL 异常返回 Double (java.lang.IllegalArgumentException)

java - 使用java从css中提取十六进制颜色

java - 通过 SWIG 在 Java 中访问 uint8_t vector

java - 在 Spring Data MongoDB 中使用 List 参数进行存储库查询

java - Storm bolt 如何从不同的喷口或其他 bolt 接收多种类型的元组?

java - 可以将我的公共(public)接口(interface)放入他们自己的包中

java - 泛型java的数组搜索

Java:有限递归中的 Stackoverflow

Java Swing : scale image read from url