Skip to content

Commit 966ff98

Browse files
add 1309
1 parent cb0f583 commit 966ff98

File tree

1 file changed

+145
-0
lines changed

1 file changed

+145
-0
lines changed

contest/src/main/java/com/github/contest/strings/StringsLeetcode.kt

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,4 +89,149 @@ fun percentageLetter(s: String, letter: Char): Int {
8989
}
9090

9191

92+
/**
93+
* 1309. Decrypt String from Alphabet to Integer Mapping
94+
*/
95+
96+
fun freqAlphabets(s: String): String {
97+
val result = StringBuilder()
98+
var i = s.length - 1
99+
100+
while (i >= 0) {
101+
if (s[i] == '#') {
102+
val twoDigit = s.substring(i - 2, i).toInt()
103+
result.append(getLetterFromIndex(twoDigit - 1))
104+
i -= 3
105+
} else {
106+
result.append(getLetterFromIndex(s[i].digitToInt() - 1))
107+
i -= 1
108+
}
109+
}
110+
111+
return result.reverse().toString()
112+
}
113+
114+
fun getLetterFromIndex(index: Int): Char {
115+
require(index in 0..25) { "Index must be between 0 and 25 (inclusive)" }
116+
return 'a' + index
117+
}
118+
119+
120+
/**
121+
*
122+
*/
123+
124+
fun isNumber(s: String): Boolean = when {
125+
isOnlyNumbers(s) -> true
126+
hasLetter(s) -> false
127+
isValidNumberSign(s) && !hasExponential(s) -> true
128+
isNotValidNumberSign(s) -> false
129+
else -> hasNumberExponential(s)
130+
}
131+
132+
private fun hasNumberExponential(str: String): Boolean {
133+
var indexExp = 0
134+
var isNotDigits = true
135+
for (i in str.indices) {
136+
if (isExponential(str[i])) {
137+
indexExp = i
138+
break
139+
}
140+
}
141+
142+
for (i in 0 until indexExp) {
143+
if (isDigit(str[i])) isNotDigits = false
144+
}
145+
146+
if (isNotDigits) return false
147+
isNotDigits = true
148+
for (i in indexExp until str.length) {
149+
if (str[i] == '.') return false
150+
if (isDigit(str[i])) isNotDigits = false
151+
}
152+
153+
return !isNotDigits
154+
}
155+
156+
private fun isValidNumberSign(str: String): Boolean {
157+
var isPlusOrMinus = false
158+
var isOneDot = false
159+
for (char in str) {
160+
if (isSign(char)) {
161+
if (isPlusOrMinus) return false
162+
else isPlusOrMinus = true
163+
}
164+
if (isDot(char) && !isOneDot) {
165+
isOneDot = true
166+
continue
167+
}
168+
if (isDot(char) && isOneDot) return false
169+
}
170+
return true
171+
}
172+
173+
private fun hasExponential(str: String): Boolean {
174+
for (char in str) if (isExponential(char)) return true
175+
return false
176+
}
177+
178+
private fun isNotValidNumberSign(str: String): Boolean {
179+
var isPlusOrMinus = false
180+
var isOneDot = false
181+
for (char in str) {
182+
if (isSign(char)) {
183+
if (isPlusOrMinus) return true
184+
else isPlusOrMinus = true
185+
}
186+
if (isDot(char) && !isOneDot) {
187+
isOneDot = true
188+
continue
189+
}
190+
if (isOneDot) return true
191+
}
192+
return false
193+
}
194+
195+
private fun hasLetter(str: String): Boolean {
196+
for (char in str) {
197+
if (isLetter(char)) return true
198+
}
199+
return false
200+
}
201+
202+
private fun isOnlyNumbers(str: String): Boolean {
203+
for (char in str) {
204+
if (isLetter(char) || isExponential(char) || isSign(char) || isDot(char)) return false
205+
}
206+
return true
207+
}
208+
209+
fun isDigit(char: Char): Boolean = when {
210+
char in '0'..'9' -> true
211+
else -> false
212+
}
213+
214+
fun isLetter(char: Char): Boolean = when {
215+
(char != 'e' && char != 'E') && (char in 'a'..'z' || char in 'A'..'Z') -> true
216+
else -> false
217+
}
218+
219+
fun isExponential(char: Char): Boolean = when {
220+
char == 'e' || char == 'E' -> true
221+
else -> false
222+
}
223+
224+
fun isDot(char: Char) = when {
225+
char == '.' -> true
226+
else -> false
227+
}
228+
229+
fun isSign(char: Char): Boolean {
230+
return when {
231+
char == '+' || char == '-' -> true
232+
else -> false
233+
}
234+
}
235+
236+
92237

0 commit comments

Comments
 (0)