找到73个回文

时间:2017-11-06 00:08:36

标签: scala collections binary decimal palindrome

我试图找到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)
  }
}

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

2 个答案:

答案 0 :(得分:2)

你的蓝图很好。只是不要假设前100个整数中存在前73个回文。您甚至可以从负数开始,因为它的二进制表示可能是回文。为简单起见,我将从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;
  }
}

答案 1 :(得分:1)

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)

强制使用Stream

评估sum

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