Skip to content

Commit c89ce3e

Browse files
Solutions updated 3516-3519
1 parent fa4c220 commit c89ce3e

File tree

4 files changed

+178
-0
lines changed

4 files changed

+178
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
class Solution {
2+
public int findClosest(int x, int y, int z) {
3+
int dis1 = Math.abs(x - z), dis2 = Math.abs(y - z);
4+
if (dis1 == dis2)
5+
return 0;
6+
return dis1 > dis2 ? 2 : 1;
7+
}
8+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import java.util.Arrays;
2+
3+
class Solution {
4+
public String smallestPalindrome(String s) {
5+
int n = s.length();
6+
int m = n / 2;
7+
8+
if (n == 1 || n == 2)
9+
return s;
10+
11+
char[] fArr = s.substring(0, m).toCharArray();
12+
Arrays.sort(fArr);
13+
String f = new String(fArr);
14+
15+
StringBuilder rev = new StringBuilder(f).reverse();
16+
17+
if (n % 2 == 1) {
18+
f += s.charAt(m);
19+
}
20+
21+
return f + rev.toString();
22+
}
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
class Solution {
2+
public String smallestPalindrome(String inputStr, int K) {
3+
int[] frequency = new int[26];
4+
for (int i = 0; i < inputStr.length(); i++) {
5+
char ch = inputStr.charAt(i);
6+
frequency[ch - 'a']++;
7+
}
8+
char mid = 0;
9+
for (int i = 0; i < 26; i++) {
10+
if (frequency[i] % 2 == 1) {
11+
mid = (char) ('a' + i);
12+
frequency[i]--;
13+
break;
14+
}
15+
}
16+
int[] halfFreq = new int[26];
17+
int halfLength = 0;
18+
for (int i = 0; i < 26; i++) {
19+
halfFreq[i] = frequency[i] / 2;
20+
halfLength += halfFreq[i];
21+
}
22+
long totalPerms = multinomial(halfFreq);
23+
if (K > totalPerms)
24+
return "";
25+
StringBuilder firstHalfBuilder = new StringBuilder();
26+
for (int pos = 0; pos < halfLength; pos++) {
27+
for (int c = 0; c < 26; c++) {
28+
if (halfFreq[c] > 0) {
29+
halfFreq[c]--;
30+
long perms = multinomial(halfFreq);
31+
if (perms >= K) {
32+
firstHalfBuilder.append((char) ('a' + c));
33+
break;
34+
} else {
35+
K -= perms;
36+
halfFreq[c]++;
37+
}
38+
}
39+
}
40+
}
41+
String firstHalf = firstHalfBuilder.toString();
42+
String revHalf = new StringBuilder(firstHalf).reverse().toString();
43+
String result;
44+
if (mid == 0) {
45+
result = firstHalf + revHalf;
46+
} else {
47+
String midStr = new String(new char[] { mid });
48+
result = firstHalf + midStr + revHalf;
49+
}
50+
return result;
51+
}
52+
53+
static long maxK = 1000001;
54+
55+
public long multinomial(int[] counts) {
56+
int tot = 0;
57+
for (int cnt : counts) {
58+
tot += cnt;
59+
}
60+
long res = 1;
61+
for (int i = 0; i < 26; i++) {
62+
int cnt = counts[i];
63+
res = res * binom(tot, cnt);
64+
if (res >= maxK)
65+
return maxK;
66+
tot -= cnt;
67+
}
68+
return res;
69+
}
70+
71+
public long binom(int n, int k) {
72+
if (k > n)
73+
return 0;
74+
if (k > n - k)
75+
k = n - k;
76+
long result = 1;
77+
for (int i = 1; i <= k; i++) {
78+
result = result * (n - i + 1) / i;
79+
if (result >= maxK)
80+
return maxK;
81+
}
82+
return result;
83+
}
84+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import java.util.HashMap;
2+
3+
public class Solution {
4+
final int MOD = 1000000007;
5+
int base;
6+
int[] digits;
7+
HashMap<String, Integer> memo;
8+
9+
public int countNumbers(String l, String r, int b) {
10+
base = b;
11+
int fr = f(r);
12+
int fl = l.equals("0") ? 0 : f(new java.math.BigInteger(l).subtract(java.math.BigInteger.ONE).toString());
13+
return (fr - fl + MOD) % MOD;
14+
}
15+
16+
private int f(String x) {
17+
digits = dec2base(new java.math.BigInteger(x), base);
18+
memo = new HashMap<>();
19+
return dp(0, -1, true, false);
20+
}
21+
22+
private int[] dec2base(java.math.BigInteger num, int base) {
23+
if (num.equals(java.math.BigInteger.ZERO))
24+
return new int[] { 0 };
25+
ArrayList<Integer> list = new ArrayList<>();
26+
while (num.compareTo(java.math.BigInteger.ZERO) > 0) {
27+
list.add(num.mod(java.math.BigInteger.valueOf(base)).intValue());
28+
num = num.divide(java.math.BigInteger.valueOf(base));
29+
}
30+
Collections.reverse(list);
31+
return list.stream().mapToInt(i -> i).toArray();
32+
}
33+
34+
private int dp(int i, int last, boolean tight, boolean started) {
35+
if (i == digits.length)
36+
return 1;
37+
38+
String key = i + "," + last + "," + tight + "," + started;
39+
if (memo.containsKey(key))
40+
return memo.get(key);
41+
42+
int up = tight ? digits[i] : base - 1;
43+
int ways = 0;
44+
45+
for (int d = 0; d <= up; d++) {
46+
boolean newTight = tight && (d == up);
47+
if (!started) {
48+
if (d == 0) {
49+
ways = (ways + dp(i + 1, -1, newTight, false)) % MOD;
50+
} else {
51+
ways = (ways + dp(i + 1, d, newTight, true)) % MOD;
52+
}
53+
} else {
54+
if (d < last)
55+
continue;
56+
ways = (ways + dp(i + 1, d, newTight, true)) % MOD;
57+
}
58+
}
59+
60+
memo.put(key, ways);
61+
return ways;
62+
}
63+
}

0 commit comments

Comments
 (0)