找到 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;
}
}
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)
用sum
强制计算Stream
:
scala> findPalindromes(73).sum
res10: Int = 35619
我试图找到 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;
}
}
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)
用sum
强制计算Stream
:
scala> findPalindromes(73).sum
res10: Int = 35619