CSpadawan
CSpadawan

Reputation: 115

Run-length decompression

CS student here. I want to write a program that will decompress a string that has been encoded according to a modified form of run-length encoding (which I've already written code for). For instance, if a string contains 'bba10' it would decompress to 'bbaaaaaaaaaa'. How do I get the program to recognize that part of the string ('10') is an integer?

Thanks for reading!

Upvotes: 0

Views: 1632

Answers (6)

ArunJose
ArunJose

Reputation: 2159

Here is a working implementation in python. This also works fine for 2 or 3 or multiple digit numbers

inputString="a1b3s22d4a2b22"
inputString=inputString+"\0"                 //just appending a null char
charcount=""
previouschar=""
outputString=""

for char in inputString:
  if char.isnumeric():
    charcount=charcount+char  
  else:
    outputString=outputString
    if previouschar:
      outputString=outputString+(previouschar*int(charcount))   
    charcount=""
    previouschar=char
    
print(outputString) // outputString= abbbssssssssssssssssssssssddddaabbbbbbbbbbbbbbbbbbbbbb

Upvotes: 0

isnot2bad
isnot2bad

Reputation: 24444

Assuming that the uncompressed data does never contain digits: Iterate over the string, character by character until you get a digit. Then continue until you have a non-digit (or end of string). The digits inbetween can be parsed to an integer as others already stated:

int count = Integer.parseInt(str.substring(start, end));

Upvotes: 0

Simone Buzzi
Simone Buzzi

Reputation: 76

I think you can divide chars in numeric and not numeric symbols.

When you find a numeric one (>0 and <9) you look to the next and choose to enlarge you number (current *10 + new) or to expand your string

Upvotes: 0

Marko Topolnik
Marko Topolnik

Reputation: 200138

A simple regex will do.

final Matcher m = Pattern.compile("(\\D)(\\d+)").matcher(input);
final StringBuffer b = new StringBuffer();
while (m.find()) 
  m.appendReplacement(b, replicate(m.group(1), Integer.parseInt(m.group(2))));
m.appendTail(b);

where replicate is

String replicate(String s, int count) {
  final StringBuilder b = new StringBuilder(count);
  for (int i = 0; i < count; i++) b.append(s);
  return b.toString();
}

Upvotes: 4

JQian
JQian

Reputation: 226

Not sure whether this is one efficient way, but just for reference

for (int i=0;i<your_string.length();i++)
    if (your_string.charAt(i)<='9' && your_string.charAt(i)>='0')
        integer_begin_location = i;

Upvotes: 0

Mox
Mox

Reputation: 589

Presuming that you're not asking about the parsing, you can convert a string like "10" into an integer like this:

int i = Integer.parseInt("10");

Upvotes: -1

Related Questions