To do my job, I need a code that takes a word from the user, then recognizes the number of consecutive letters and outputs it in such a way that it prints the letter and the number of times it is repeated.
Example 1 input:
JavaScript
x
hhhttrew
Example 1 output:
JavaScript
h3t2rew
Example 2 input:
JavaScript
uuuuuuhhhaaajqqq
Example 2 output:
JavaScript
u6h3a3jq3
JavaScript
String text = sc.nextLine();
int len = text.length();
int repeat = 0;
char[] chars = new char[len];
// To convert string to char
for (int h = 0; h < len; h++)
{
chars[h] = text.charAt(h);
}
String finaly = "";
for (char ignored : chars)
{
for (int j = 0 ; j <len ; j++ )
{
if (chars[j] == chars[j+1])
{
finaly = String.valueOf(chars[j]);
repeat++;
finaly = String.valueOf(repeat);
}
else
{
j++;
}
}
}
System.out.println(finaly);
Advertisement
Answer
Here is one way. You only need a single loop. The inner loop does the work. The outer loop simply supplies test cases.
- assign the first character
- and set count to 1 for that character
- then iterate until adjacent characters are different
- append count if > 1 and append the different character
- set count to 0 for next run.
JavaScript
String[] data = { "uuuuuuhhhaaajqqq",
"hhhttrew","abbcccddddeeeeeffffffggggggg" };
for (String s : data) {
String result = "" + s.charAt(0);
int count = 1;
for (int i = 1; i < s.length(); i++) {
if (s.charAt(i - 1) != s.charAt(i)) {
result += count <= 1 ? "" : count;
result += s.charAt(i);
count = 0;
}
count++;
if (i == s.length() - 1) {
result += count <= 1 ? "" : count;
}
}
System.out.printf("%-15s <-- %s%n", result, s);
}
prints
JavaScript
u6h3a3jq3 <-- uuuuuuhhhaaajqqq
h3t2rew <-- hhhttrew
ab2c3d4e5f6g7 <-- abbcccddddeeeeeffffffggggggg
In a comment (now deleted) you had enquired how to reverse the process. This is one way to do it.
- allocate a
StringBuilder
to hold the result. - initialize
count
andcurrentChar
- as the string is processed,
- save a character to
currentChar
- then while the next char(s) is a digit, build the count
- save a character to
- if the count is still 0, then the next character was a digit so bump count by one and copy the
currentChar
to the buffer - otherwise, use the computed length.
JavaScript
String[] encoded =
{ "u6h3a3jq3", "h3t2rew", "ab2c3d4e5f6g7" };
for (String s : encoded) {
StringBuilder sb = new StringBuilder();
int count = 0;
char currentChar = '';
for (int i = 0; i < s.length();) {
if (Character.isLetter(s.charAt(i))) {
currentChar = s.charAt(i++);
}
while (i < s.length()
&& Character.isDigit(s.charAt(i))) {
count = count * 10 + s.charAt(i++) - '0';
}
count = count == 0 ? 1 : count;
sb.append(Character.toString(currentChar)
.repeat(count));
count = 0;
}
System.out.println(s + " --> " + sb);
}
prints
JavaScript
u6h3a3jq3 --> uuuuuuhhhaaajqqq
h3t2rew --> hhhttrew
ab2c3d4e5f6g7 --> abbcccddddeeeeeffffffggggggg