I am reading a book with different quizzes about coding interviews.
Please implement a function that increments a string based on the rules below:
- It should take the string of unknown length and increment the numberic ending of that string by 1.
- If numberic ending is overflown it must be reset.
- Don't use regular expressions
Examples of correct functionality are the following:
assertEquals("000003", increment("000002"));
assertEquals("000000", increment("999999"));
assertEquals("GL-322", increment("GL-321"));
assertEquals("GL-000", increment("GL-999"));
assertEquals("DRI000EDERS1RE", increment("DRI000EDERS0RE"));
assertEquals("DRI000EDERS0RE00000", increment("DRI000EDERS0RE99999"));
Here is my solution, I am sure it could be vastly more efficient / succinct:
public class Increment {
static String padLeftZeros(String inputString, int length) {
if (inputString.length() >= length) {
return inputString;
}
StringBuilder sb = new StringBuilder();
while (sb.length() < length - inputString.length()) {
sb.append('0');
}
sb.append(inputString);
return sb.toString();
}
static String increment(String referenceNumber) {
// Finding the last digit index in referenceNumber
int indexLastDigit = -1;
for (int i = 0; i < referenceNumber.length(); i++){
try {
Integer.parseInt(String.valueOf(referenceNumber.charAt(i)));
indexLastDigit = i;
} catch (NumberFormatException nfe) {
}
}
// Finding the first digit index of the last digit group in referenceNumber
int indexFirstDigit = -1;
for (int i = indexLastDigit; i >= 0; i--){
try {
Integer.parseInt(String.valueOf(referenceNumber.charAt(i)));
indexFirstDigit = i;
} catch (NumberFormatException nfe) {
break;
}
}
// Checking if numberToIncrement needs reset or not
String numberToIncrement = referenceNumber.substring(indexFirstDigit, indexLastDigit + 1);
boolean isReset = true;
for (int i = 0; i < numberToIncrement.length(); i++){
if (numberToIncrement.charAt(i) != '9') {
isReset = false;
}
}
// Incrementing or resetting number
StringBuilder incrementedNumberSB = new StringBuilder();
int incrementedNumberInt;
if (isReset) {
for (int i = 0; i < numberToIncrement.length(); i++){
incrementedNumberSB.append("0");
}
} else {
incrementedNumberInt = Integer.parseInt(numberToIncrement) + 1;
incrementedNumberSB.append(incrementedNumberInt);
}
// Creating result string according to referenceNumber structure
String incrementedNumberString = padLeftZeros(incrementedNumberSB.toString(), numberToIncrement.length());
String prefix = referenceNumber.substring(0, indexFirstDigit);
String suffix = referenceNumber.substring(indexLastDigit + 1, referenceNumber.length());
String result = "";
if (prefix.length() > 0) {
result += prefix;
}
result += incrementedNumberString;
if (suffix.length() > 0) {
result += suffix;
}
return result;
}
}
assertEquals("DRI000EDERS1RE", increment("DRI000EDERS0RE"));
Why? How should the program determine the correct result here? I think we're missing an important part of the challenge here. Are all numbers in base 10 and thus all non 0-9 characters irrelevant when incrementing?assertEquals("DRI000EDERS0RE00000", increment("DRI000EDERS0RE99999"));
The incremented value doesn't roll over to the0
inSORE
? \$\endgroup\$ – Mast Oct 12 '20 at 7:24