我试图找到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)
}
}
我知道一些收藏功能,但我没有太多使用它们的经验。如果您能向我解释在这种情况下可以使用哪些集合和功能,我将不胜感激。 我会非常感谢任何帮助!
答案 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)
filter
和take
可以在这里使用而不是循环。
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