Last active
April 20, 2019 02:26
-
-
Save brunodrugowick/345d1e4f44b35de5393fdb6e8b8836d2 to your computer and use it in GitHub Desktop.
A solution to Beautiful Days (hackerrank) in Java 8
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import java.io.*; | |
import java.math.*; | |
import java.security.*; | |
import java.text.*; | |
import java.util.*; | |
import java.util.concurrent.*; | |
import java.util.regex.*; | |
public class Solution { | |
// Complete the beautifulDays function below. | |
static int beautifulDays(int i, int j, int k) { | |
int numberOfBeautifulDays = 0; | |
for (int day = i; day <= j; day++) { | |
if (isBeautiful(day, k)) numberOfBeautifulDays++; | |
} | |
return numberOfBeautifulDays; | |
} | |
static boolean isBeautiful(int day, int divisor) { | |
int reverseDay = getReverseNumber(day); | |
if (Math.abs((day - reverseDay)%divisor) == 0) return true; | |
return false; | |
} | |
static int getReverseNumber(int number) { | |
StringBuilder reverseString = new StringBuilder(); | |
reverseString.append(number); | |
reverseString = reverseString.reverse(); | |
int reverseNumber = Integer.parseInt(reverseString.toString()); | |
return reverseNumber; | |
} | |
/** | |
* This is the first version I implemented before knowing that Stringbuilder | |
* could be used. Here for information only. | |
* | |
* @param number to reverse (example 123456) | |
* @return a number reverted (example 654321) | |
*/ | |
static int getReverseNumber_alternative(int number) { | |
int remainingNumber = number; | |
String reverseNumberString = ""; | |
while (remainingNumber >= 10) { | |
int lastDigit = remainingNumber % 10; | |
remainingNumber = remainingNumber / 10; | |
reverseNumberString += String.valueOf(lastDigit); | |
} | |
reverseNumberString += String.valueOf(remainingNumber); | |
return Integer.parseInt(reverseNumberString); | |
} | |
private static final Scanner scanner = new Scanner(System.in); | |
public static void main(String[] args) throws IOException { | |
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(System.getenv("OUTPUT_PATH"))); | |
String[] ijk = scanner.nextLine().split(" "); | |
int i = Integer.parseInt(ijk[0]); | |
int j = Integer.parseInt(ijk[1]); | |
int k = Integer.parseInt(ijk[2]); | |
int result = beautifulDays(i, j, k); | |
bufferedWriter.write(String.valueOf(result)); | |
bufferedWriter.newLine(); | |
bufferedWriter.close(); | |
scanner.close(); | |
} | |
} |
The problem is at this function:
static int getReverseNumber_wrong(int number) {
int remainingNumber = number;
String reverseNumberString = "";
while (remainingNumber > 10) {
int lastDigit = remainingNumber % 10;
remainingNumber = remainingNumber / 10;
reverseNumberString += String.valueOf(lastDigit);
}
reverseNumberString += String.valueOf(remainingNumber);
return Integer.parseInt(reverseNumberString);
}
The solution (and also a better implementation) is to use StringBuilder to reverse the number, like so:
static int getReverseNumber(int number) {
StringBuilder reverseString = new StringBuilder();
reverseString.append(number);
reverseString = reverseString.reverse();
int reverseNumber = Integer.parseInt(reverseString.toString());
return reverseNumber;
}
But I'm invetigating my previous function to understand what was wrong.
Oh, crap! Hahahaha.
I compared the results of both functions and they only differ when the number starts with 10, so the problem was this line
while (remainingNumber > 10) {
which should be:
while (remainingNumber >= 10) {
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Actually my first version doesn't work with some test cases. I'll have to investigate further.