-
Notifications
You must be signed in to change notification settings - Fork 22
Expand file tree
/
Copy pathNumberOfZeros.java
More file actions
78 lines (67 loc) · 1.82 KB
/
NumberOfZeros.java
File metadata and controls
78 lines (67 loc) · 1.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
public class NumberOfZeros {
final int LIMIT_L = 10000;
final int MODULO = 1410000017;
int[] tenPowers;
int[] leftNumbers;
int[] rightNumbers;
public int solution(String S) {
buildTenPowers();
buildLeftNumbers(S);
buildRightNumbers(S);
int zeroNum = 1;
for (int i = 1; i < S.length(); i++) {
int wholeRight = getTenPower(S.length() - i - 1);
int addition = multiplyMod(addMod(getLeftNumber(i - 1), -1),
wholeRight);
int digit = S.charAt(i) - '0';
if (digit == 0) {
addition = addMod(addition, addMod(getRightNumber(i + 1), 1));
} else if (digit > 0) {
addition = addMod(addition, wholeRight);
}
zeroNum = addMod(zeroNum, addition);
}
return zeroNum;
}
int addMod(int x, int y) {
return (int) (((long) x + y + MODULO) % MODULO);
}
int multiplyMod(int x, int y) {
return (int) ((long) x * y % MODULO);
}
void buildTenPowers() {
tenPowers = new int[LIMIT_L];
tenPowers[0] = 1;
for (int i = 1; i < tenPowers.length; i++) {
tenPowers[i] = multiplyMod(tenPowers[i - 1], 10);
}
}
void buildLeftNumbers(String S) {
leftNumbers = new int[S.length()];
int leftNumber = 0;
for (int i = 0; i < leftNumbers.length; i++) {
leftNumber = addMod(multiplyMod(leftNumber, 10), S.charAt(i) - '0');
leftNumbers[i] = leftNumber;
}
}
void buildRightNumbers(String S) {
int rightNumber = 0;
rightNumbers = new int[S.length()];
for (int i = S.length() - 1; i >= 0; i--) {
rightNumber = addMod(
rightNumber,
multiplyMod(S.charAt(i) - '0', getTenPower(S.length() - i
- 1)));
rightNumbers[i] = rightNumber;
}
}
int getTenPower(int power) {
return tenPowers[power];
}
int getLeftNumber(int index) {
return (index >= 0) ? leftNumbers[index] : 0;
}
int getRightNumber(int index) {
return (index < rightNumbers.length) ? rightNumbers[index] : 0;
}
}