Calculating Simple Max Digit Sum in Java

The challenge

In this challenge, you will be given an integer `n` and your task will be to return `the largest integer that is <= n and has the highest digit sum`.

For example:

```.wp-block-code{border:0;padding:0}.wp-block-code>div{overflow:auto}.shcb-language{border:0;clip:rect(1px,1px,1px,1px);-webkit-clip-path:inset(50%);clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;word-wrap:normal;word-break:normal}.hljs{box-sizing:border-box}.hljs.shcb-code-table{display:table;width:100%}.hljs.shcb-code-table>.shcb-loc{color:inherit;display:table-row;width:100%}.hljs.shcb-code-table .shcb-loc>span{display:table-cell}.wp-block-code code.hljs:not(.shcb-wrap-lines){white-space:pre}.wp-block-code code.hljs.shcb-wrap-lines{white-space:pre-wrap}.hljs.shcb-line-numbers{border-spacing:0;counter-reset:line}.hljs.shcb-line-numbers>.shcb-loc{counter-increment:line}.hljs.shcb-line-numbers .shcb-loc>span{padding-left:.75em}.hljs.shcb-line-numbers .shcb-loc::before{border-right:1px solid #ddd;content:counter(line);display:table-cell;padding:0 .75em;text-align:right;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;white-space:nowrap;width:1%}```solve(100) = 99. Digit Sum for 99 = 9 + 9 = 18. No other number <= 100 has a higher digit sum.
solve(10) = 9
solve(48) = 48. Note that 39 is also an option, but 48 is larger.```Code language: HTML, XML (xml)```

Input range is `0 < n < 1e11`

The solution in Java code

Option 1:

``````class Solution{
public static long solve(long n) {
if (n < 10)
return n;
long m = n, e = 1;
do {
m /= 10;
e *= 10;
} while (m >= 10);
long t = m * e + (e - 1);
for (e = 1; ; e *= 10)
if (t - e <= n)
return t - e;
}
}
```Code language: Java (java)```

Option 2:

``````class Solution{
public static long solve(long n) {
if (n > 0) {
int nLength = String.valueOf(n).chars().map(a -> 1).sum();
int sum = 0;
int[] digits = new int[nLength];
for (int i = 0; i < nLength; i++) {
digits[i] = Character.getNumericValue(String.valueOf(n).charAt(i));
sum += digits[i];
}
if (sum >= (digits[0] - 1) + ((nLength - 1) * 9)) {
return n;
}
if (digits[1] < 9) {
digits[0]--;
String result = String.valueOf(digits[0]);
for (int i = 0; i < nLength - 1; i++) {
result = result + 9;
}
return Long.valueOf(result);
}
for (int i = 1; i < digits.length; i++) {
if (digits[i] == 9 && digits[i + 1] < 9) {
digits[i] = 8;
for (int j = i + 1; j < digits.length; j++) {
digits[j] = 9;
}
String result = "";
for (int k = 0; k < digits.length; k++) {
result = result + digits[k];
}
return Long.valueOf(result);
}
}
}
return 0;
}

}
```Code language: Java (java)```

Option 3:

``````class Solution{

public static long solve(long n) {
long b = 1, ans = n;
while (n!=0) {
long cur = (n - 1) * b + (b - 1);
long curSumOFDigits = sumOfDigits(cur);
long ansSumOfDigits = sumOfDigits(ans);
if (curSumOFDigits > ansSumOfDigits || (curSumOFDigits == ansSumOfDigits && cur > ans)) {
ans = cur;
}
n /= 10;
b *= 10;
}
return ans;
}

private static long sumOfDigits(long a) {
long sum = 0;
while (a!=0) {
sum += a % 10;
a /= 10;
}
return sum;
}
}
```Code language: Java (java)```

Test cases to validate our solution

``````import org.junit.Test;
import static org.junit.Assert.assertEquals;
import org.junit.runners.JUnit4;

public class SolutionTest{
@Test
public void basicTests(){
assertEquals(1L,Solution.solve(1L));
assertEquals(2L,Solution.solve(2L));
assertEquals(18L,Solution.solve(18L));
assertEquals(48L,Solution.solve(48L));
assertEquals(99L,Solution.solve(100L));
assertEquals(9L,Solution.solve(10L));
assertEquals(99L,Solution.solve(110L));
assertEquals(1999L,Solution.solve(2090L));
assertEquals(999999999989L,Solution.solve(999999999992L));
}
}
```Code language: Java (java)```
Tags:
Subscribe
Notify of