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 getReverseNumber is an interesting function. It uses the characteristics of division with integers to get what we need:
int lastDigit = remainingNumber % 10;
gets the last digit bythe rest of the division by 10
.remainingNumber = remainingNumber / 10;
gets the remainder bydividing the number by 10
.
We do that while the remainder is greater than 10, in other words, while there's more than one digit
.
Actually my first version doesn't work with some test cases. I'll have to investigate further.
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
https://www.hackerrank.com/challenges/beautiful-days-at-the-movies/problem