【问题标题】:Program to find the number of 'a' in a string that is repeated n characters?程序查找重复 n 个字符的字符串中“a”的数量?
【发布时间】:2019-04-20 16:11:38
【问题描述】:

我正在编写一个程序来查找给定字符串中重复的“a”的数量。例如,调用 findAmountA("aba", 7) 意味着它在字符串 "aba" 中找到重复 7 个字符的 'a' 的数量。所以 "abaabaa" 是最后一个字符串,所以调用会返回 5。

如果没有实际使字符串 7 个字符(因此调用 1,000,000 个字符不会花费这么长时间),我将如何使用数学来完成这项任务?我无法比这更进一步,因为我一直在尝试解决此问题。

请记住,我是一名初学 Java 程序员(学生),不想使用任何我在高中不会学的高级/花哨的语法。谢谢!

public class AInString {
    public static void main(String[] args) {
        boolean a = findAmountA("aba", 10) == 7;
        boolean b = findAmountA("a", 100) == 100;
        boolean c = findAmountA("abca", 10) == 5;
        boolean d = findAmountA("", 10) == 0;
        boolean e = findAmountA("abcaa", 1000000) == 600000;
        boolean f = findAmountA("abc", 0) == 0;
        boolean g = findAmountA("bcd", 10) == 0;
        System.out.println(a && b && c && d && e && f && g);
    }
    public static int findAmountA(String word, int n) {
        String s = word;
        if(s.length() == 0 || aInWord(word) == 0) {
            return 0;
        }else {
            int a = (aInWord(s));
            return a;
        }
    }
    public static int aInWord(String word) {
        String s = word;
        int aInWord = 0;
        for(int i = 0; i < word.length(); i++) {
            if(s.charAt(i) == 'a') {
                aInWord++;
            }
        }
        return aInWord;
    }

}

【问题讨论】:

  • 我对初学者的最大建议是:除非万不得已,否则不要花哨。过早的优化是导致错误的最大不必要原因之一。
  • @JoeC 这正是我的观点,我不想使用花哨的东西,我正在尝试找到一个简单的解决方案

标签: java string char substring


【解决方案1】:

假设您的短字符串w 中有N 个'a' 副本。然后结果字符串将包含 K 个 w 的副本,后跟一个可能为空的“尾部”字符串。

K的值可以通过将目标字符串中'a's的数量除以N来确定。那么“尾部”中'a's的数量t将等于余数该部门的。现在您可以打印 K 份 w 后跟包含 t 'a's 的最短前缀 'w'

【讨论】:

    【解决方案2】:

    目标长度除以输入长度:例如:

    7 / 3 = 2 remainder 1
    

    2 您将使用的整个输入字符串的“完整副本”数。所以,求整个字符串中“a”的个数,乘以 2。

    您将输入的前 1 个字符组成其余 7 个字符。计算该子字符串中“a”的数量。

    只需将这两个数字相加即可。

    int total = count(input, "a") * targetLength / input.length()
              + count(input.substring(0, targetLength % input.length()), "a");
    

    其中count(input, c) 是一种计算cinput 中出现次数的方法。

    【讨论】:

      【解决方案3】:

      现在您已经计算了字符串 word 中字符 a 的出现次数,您可以计算字符串扩展 n 字符中字符的出现次数:

      return n / word.length() * aInWord(word) + aInWord(word.substring(0, n % word.length()));
      

      n / word.length() 给出了适合n 的字符串的完整重复次数。将其乘以 aInWord(word) 的计数得到 a 的计数,重复的 word 完全适合 n

      剩下的就是在word 的子字符串中找到不完全适合n 的重复次数,使用% 模运算符来查找部分子字符串的大小(如果有的话) .将这两个计数相加会产生扩展字符串中出现的总次数。

      这是一个干净的版本,它避免了重复变量、额外的条件和泛化方法以最大限度地提高可重用性:

      class Main {
          public static void main(String[] args) {
              assert findAmount("aba", 10, "a") == 7;
              assert findAmount("a", 100, "a") == 100;
              assert findAmount("abca", 10, "a") == 5;
              assert findAmount("", 10, "a") == 0;
              assert findAmount("abcaa", 1000000, "a") == 600000;
              assert findAmount("abc", 0, "a") == 0;
              assert findAmount("bcd", 10, "a") == 0;
              System.out.println("tests passed");
          }
      
          public static int findAmount(String word, int n, String target) {
              if (word.length() == 0) {
                  return 0;
              }
      
              return n / word.length() * count(target, word) + 
                     count(target, word.substring(0, n % word.length()));
          }
      
          public static int count(String target, String s) {
              return s.length() - s.replace(target, "").length();
          }
      }
      

      Try it!

      【讨论】:

        【解决方案4】:

        我对你的代码做了一些改动,看看:

        public static void main(String[] args) {
            int a = findAmountA("aba", 10); // 7
            int b = findAmountA("a", 100); // 100;
            int c = findAmountA("abca", 10); //5;
            int d = findAmountA("", 10); //0;
            int f = findAmountA("abc", 0); //0;
            int g = findAmountA("bcd", 10); //0;
            System.out.println(a + " " + b + " " + c + " " + d + " " + f + " " + g);
        }
        
        public static int findAmountA(String word, int n) {
            if (word.length() < n) {
                for (int i=0; i<word.length(); i++) {
                    while (word.length() < n) {
                        word = word + word.charAt(i);
                        break;
                    }
                }
            } else if (word.length() > n) {
                for (int i=0; i<word.length(); i++) {
                    word = word.substring(0, n);
                }
            } else {
                return aInWord(word);
            }
            return aInWord(word);
        }
        
        public static int aInWord(String word) {
            String s = word;
            int aInWord = 0;
            for(int i = 0; i < word.length(); i++) {
                if(s.charAt(i) == 'a') {
                    aInWord++;
                }
            }
        

        【讨论】:

          【解决方案5】:

          感谢大家的帮助,使用子字符串我找到了答案:

          public class AInString {
              public static void main(String[] args) {
                  boolean a = findAmountA("aba", 10) == 7;
                  boolean b = findAmountA("a", 100) == 100;
                  boolean c = findAmountA("abca", 10) == 5;
                  boolean d = findAmountA("", 10) == 0;
                  boolean e = findAmountA("abcaa", 1000000) == 600000;
                  boolean f = findAmountA("abc", 0) == 0;
                  boolean g = findAmountA("bcd", 10) == 0;
                  System.out.println(a && b && c && d && e && f && g);
              }
              public static int findAmountA(String word, int n) {
                  String s = word;
                  if(s.length() == 0 || aInWord(s) == 0) {
                      return 0;
                  }else {
                      int a = aInWord(s)*(n/s.length());
                      int b = n % s.length();
                      return a + aInWord(s.substring(0, b));
                  }
              }
              public static int aInWord(String word) {
                  String s = word;
                  int aInWord = 0;
                  for(int i = 0; i < word.length(); i++) {
                      if(s.charAt(i) == 'a') {
                          aInWord++;
                      }
                  }
                  return aInWord;
              }
          
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-08-26
            • 2015-03-08
            • 1970-01-01
            • 2015-03-21
            • 1970-01-01
            • 2012-11-30
            • 2019-02-23
            相关资源
            最近更新 更多