找到 73 个回​​文

Find 73 palindromes

我试图找到 73 个二进制表示为回文的十进制数。我还需要得到这些数字的总和。 我是 Scala 的新手,所以我一直在尝试创建这个定义回文并对它们求和的函数。问题是我真的不知道如何将它组合成一个函数并包括应该有 73 个数字。

我已经有了一个定义回文的简单函数:

def isPalindrome(someNumber: String): Boolean = someNumber.length > 1 && someNumber.reverse.mkString == someNumber

而且我已经为我的主要功能制定了某种蓝图。我尝试将所有找到的回文数字写入列表(以便稍后我可以使用一些过滤器):

def findPalindromes(list: List[Int]): Int = {
  for(i <- 0 to 100){
    if(isPalindrome(Integer.toBinaryString(i))) {
      (xs: List[Int]) => i :: xs
    }
    sum(list)
  }
}

我知道一些集合函数,但我没有太多使用它们的经验。因此,如果您能向我解释在这种情况下可以使用哪些集合和函数,我将不胜感激。 如果有任何帮助,我将不胜感激!

你的蓝图不错。只是不要假设前 73 个回​​文存在于前 100 个整数中。您甚至可以从负数开始,因为它的二进制表示有可能是回文。为简单起见,我将从 0 开始,寻找前 73 个正回文。抱歉,我不懂 Scala,我懂 Java。算法是一样的。

输出:

...
341 is a palindrome
341 in binary is 101010101

349 is a palindrome
349 in binary is 101011101

357 is a palindrome
357 in binary is 101100101

sum:9245

代码:

public class Palindrome {

  public static void main(String[] args) {
    int count;
    int sum;
    int i;

    count = 0;
    sum = 0;

    // Start at integer 0
    i = 0;

    // Loop until we count 73 palindromes
    while (count < 73) {

      if (isPalindrome(i)) {
        System.out.println(i + " is a palindrome");
        System.out.println(i + " in binary is " + Integer.toBinaryString(i));
        System.out.println();

        // Increment the sum
        sum += i;

        // Incrememnt the counter
        count++;
      }

      // Increment the index
      i++;
    }

    System.out.println("sum:" + sum);

  }

  public static boolean isPalindrome(int n) {

    // By default, we assumt the String to be a palindrome
    boolean palindrome = true;
    String string;
    int length;

    // Convert to binary
    string = Integer.toBinaryString(n);

    // Get length of string
    length = string.length();

    // Loop half way into the string
    for (int i = 0; i < length/2 - 1; i++) {

      // Compare the ith character from beginning of string
      // to the ith character going from the end of stirng
      if (string.charAt(i) != string.charAt(length-i-1)) {

        // If they are not equal, set boolean to false, and break
        palindrome = false;
        break;
      }
    }
    return palindrome;
  }
}

filtertake 可以在这里使用而不是循环。

filter 会将一个元素添加到根据您传递给它的谓词返回的新集合中。在你的情况下是 isPalindrome

take 可用于从集合中获取 n 元素。即通过过滤器的前 73 个元素。

因此,如果将这些链接在一起,您将得到:

def findPalindromes(list: List[Int]): Int = {
  list.filter(x => isPalindrome(Integer.toBinaryString(x))).take(73).sum
}

您可以传入类似 Range(1, 10000).toList 的内容。另一个改进可能是在找到 73 个回​​文而不是找到所有回文并取前 73 个时停止。可以使用一个简单的计数器或 Stream

Stream版本比较优雅:

def findPalindromes(n: Int) = Stream.from(1).filter(x => isPalindrome(Integer.toBinaryString(x))).take(n)

sum强制计算Stream:

scala> findPalindromes(73).sum res10: Int = 35619