Skip to content

Instantly share code, notes, and snippets.

@brunodrugowick
Last active April 20, 2019 02:26
Show Gist options
  • Save brunodrugowick/345d1e4f44b35de5393fdb6e8b8836d2 to your computer and use it in GitHub Desktop.
Save brunodrugowick/345d1e4f44b35de5393fdb6e8b8836d2 to your computer and use it in GitHub Desktop.
A solution to Beautiful Days (hackerrank) in Java 8
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();
}
}
@brunodrugowick
Copy link
Author

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 by the rest of the division by 10.
  • remainingNumber = remainingNumber / 10; gets the remainder by dividing the number by 10.

We do that while the remainder is greater than 10, in other words, while there's more than one digit.

@brunodrugowick
Copy link
Author

Actually my first version doesn't work with some test cases. I'll have to investigate further.

@brunodrugowick
Copy link
Author

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.

@brunodrugowick
Copy link
Author

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