13

String を受け取り、String を返すメソッドを作成する必要があります。

Ex 入力: AAABBBBCC

Ex 出力: 3A4B2C

うーん、これはかなり恥ずかしいことで、今日の面接ではうまくできませんでした (私はジュニアのポジションに応募していました)。役に立たないループですが、十分な睡眠時間が取れていないかどうかはわかりませんが、 for ループがどのように見えるかわかりません。これはコードです:

public static String Comprimir(String texto){

    StringBuilder objString = new StringBuilder();

    int count;
    char match;

        count = texto.substring(texto.indexOf(texto.charAt(1)), texto.lastIndexOf(texto.charAt(1))).length()+1;
        match = texto.charAt(1);
        objString.append(count);
        objString.append(match);

    return objString.toString();
}

助けてくれてありがとう、私は論理スキルを向上させようとしています.

4

21 に答える 21

14

最後に見たものを思い出しながら文字列をループします。同じ文字数を見るたびに。新しい文字が表示されたら、数えたものを出力に入れ、新しい文字を最後に見たものとして設定します。

String input = "AAABBBBCC";

int count = 1;

char last = input.charAt(0);

StringBuilder output = new StringBuilder();

for(int i = 1; i < input.length(); i++){
    if(input.charAt(i) == last){
    count++;
    }else{
        if(count > 1){
            output.append(""+count+last);
        }else{
            output.append(last);
        }
    count = 1;
    last = input.charAt(i);
    }
}
if(count > 1){
    output.append(""+count+last);
}else{
    output.append(last);
}
System.out.println(output.toString());
于 2012-05-18T06:11:12.773 に答える
5

次の手順を使用してそれを行うことができます。

  • ハッシュマップを作成する
  • すべての文字について、ハッシュマップから値を取得します -値が null の場合は 1 を入力します -それ以外の場合は、値を (value+1) に置き換えます
  • HashMap を反復処理し、連結を続けます (値 + キー)
于 2012-05-18T06:13:05.730 に答える
4
  • 使用StringBuilder(あなたはそれをしました)
  • 2つの変数を定義します-previousCharcounter
  • 0から-1へのstr.length()ループ
  • 取得して、変数str.charat(i)に格納されているものと比較するたびにpreviousChar
  • 前の文字が同じ場合は、カウンターをインクリメントします
  • 前の文字が同じでなく、counterが1の場合、counterをインクリメントします
  • 前の文字が同じでなく、カウンターが1より大きい場合、追加counter + currentChar、カウンターのリセット
  • 比較後、現在の文字を割り当てますpreviousChar
  • 「最初の文字」のようなコーナーケースをカバーする

そんな感じ。

于 2012-05-18T06:09:34.163 に答える
3

count=... 行では、lastIndexOf は連続する値を気にせず、最後の発生のみを返します。

たとえば、文字列「ABBA」では、部分文字列は文字列全体になります。

また、部分文字列の長さを取得することは、2 つのインデックスを減算することと同じです。

本当にループが必要だと思います。例を次に示します。

public static String compress(String text) {
    String result = "";

    int index = 0;

    while (index < text.length()) {
        char c = text.charAt(index);
        int count = count(text, index);
        if (count == 1)
            result += "" + c;
        else
            result += "" + count + c;
        index += count;
    }

    return result;
}

public static int count(String text, int index) {
    char c = text.charAt(index);
    int i = 1;
    while (index + i < text.length() && text.charAt(index + i) == c)
        i++;
    return i;
}

public static void main(String[] args) {
    String test = "AAABBCCC";
    System.out.println(compress(test));
}
于 2012-05-18T06:16:39.080 に答える
3

これをお試し下さい。これは、コンソールを介して文字列形式で渡す文字数を出力するのに役立つ場合があります。

import java.util.*;

public class CountCharacterArray {
   private static Scanner inp;

public static void main(String args[]) {
   inp = new Scanner(System.in);
  String  str=inp.nextLine();
   List<Character> arrlist = new ArrayList<Character>();
   for(int i=0; i<str.length();i++){
       arrlist.add(str.charAt(i));
   }
   for(int i=0; i<str.length();i++){
       int freq = Collections.frequency(arrlist, str.charAt(i));
       System.out.println("Frequency of "+ str.charAt(i)+ "  is:   "+freq); 
   }
     }    
}
于 2016-03-08T07:34:19.717 に答える
2

Javaは私の主な言語ではなく、ほとんど使用していませんが、試してみたかったのです:]割り当てにループが必要かどうかさえわかりませんが、正規表現のアプローチは次のとおりです。

 public static String compress_string(String inp) {
      String compressed = "";
      Pattern pattern = Pattern.compile("([\\w])\\1*");
      Matcher matcher = pattern.matcher(inp);
      while(matcher.find()) {
         String group = matcher.group();
         if (group.length() > 1) compressed += group.length() + "";
         compressed += group.charAt(0);
      }
      return compressed;
   }
于 2012-05-18T07:34:03.400 に答える
2

これは、もう 1 つの方法です。

public static String compressor(String raw) {
        StringBuilder builder = new StringBuilder();
        int counter = 0;
        int length = raw.length();
        int j = 0;
        while (counter < length) {
            j = 0;
            while (counter + j < length && raw.charAt(counter + j) == raw.charAt(counter)) {
                j++;
            }

            if (j > 1) {
                builder.append(j);
            }
            builder.append(raw.charAt(counter));
            counter += j;
        }

        return builder.toString();
    }
于 2012-05-18T06:22:24.820 に答える
1

それはあなたを助けるかもしれません。

public class StringCompresser
{
public static void main(String[] args)
{
    System.out.println(compress("AAABBBBCC"));
    System.out.println(compress("AAABC"));
    System.out.println(compress("A"));
    System.out.println(compress("ABBDCC"));
    System.out.println(compress("AZXYC"));
}

static String compress(String str)
{
    StringBuilder stringBuilder = new StringBuilder();
    char[] charArray = str.toCharArray();
    int count = 1;
    char lastChar = 0;
    char nextChar = 0;
    lastChar = charArray[0];
    for (int i = 1; i < charArray.length; i++)
    {
        nextChar = charArray[i];
        if (lastChar == nextChar)
        {
            count++;
        }
        else
        {
            stringBuilder.append(count).append(lastChar);
            count = 1;
            lastChar = nextChar;

        }
    }
    stringBuilder.append(count).append(lastChar);
    String compressed = stringBuilder.toString();

    return compressed;
} 
}

出力:

3A4B2C
3A1B1C
1A
1A2B1D2C
1A1Z1X1Y1C
于 2016-10-15T02:00:58.630 に答える
1
private String Comprimir(String input){
        String output="";
        Map<Character,Integer> map=new HashMap<Character,Integer>();
        for(int i=0;i<input.length();i++){
            Character character=input.charAt(i);
            if(map.containsKey(character)){
                map.put(character, map.get(character)+1);
            }else
                map.put(character, 1);
        }
        for (Entry<Character, Integer> entry : map.entrySet()) {
            output+=entry.getValue()+""+entry.getKey().charValue();
        }
        return output;
    }

グアバのマルチセットを使用したもう1つの簡単な方法-

import java.util.Arrays;

import com.google.common.collect.HashMultiset;
import com.google.common.collect.Multiset;
import com.google.common.collect.Multiset.Entry;

public class WordSpit {
    public static void main(String[] args) {
        String output="";
        Multiset<String> wordsMultiset = HashMultiset.create();
        String[] words="AAABBBBCC".split("");
        wordsMultiset.addAll(Arrays.asList(words));
        for (Entry<String> string : wordsMultiset.entrySet()) {
            if(!string.getElement().isEmpty())
                output+=string.getCount()+""+string.getElement();
        }
        System.out.println(output);
    }
}
于 2012-05-18T06:21:35.757 に答える
0
public static char[] compressionTester( char[] s){

    if(s == null){
        throw new IllegalArgumentException();
    }

    HashMap<Character, Integer> map = new HashMap<>();
    for (int i = 0 ; i < s.length ; i++) {

        if(!map.containsKey(s[i])){
            map.put(s[i], 1);
        }
        else{
            int value = map.get(s[i]);
            value++;
            map.put(s[i],value);
        }           
    }               
    String newer="";

    for( Character n : map.keySet()){

        newer = newer + n + map.get(n); 
    }
    char[] n = newer.toCharArray();

    if(s.length > n.length){
        return n;
    }
    else{

        return s;               
    }                       
}
于 2015-09-27T06:17:11.357 に答える
0
package com.tell.datetime;

import java.util.Stack;
public class StringCompression {
    public static void main(String[] args) {
        String input = "abbcccdddd";
        System.out.println(compressString(input));
    }

    public static String compressString(String input) {

        if (input == null || input.length() == 0)
            return input;
        String finalCompressedString = "";
        String lastElement="";
        char[] charArray = input.toCharArray();
        Stack stack = new Stack();
        int elementCount = 0;
        for (int i = 0; i < charArray.length; i++) {
            char currentElement = charArray[i];
            if (i == 0) {
                stack.push((currentElement+""));
                continue;
            } else {
                if ((currentElement+"").equalsIgnoreCase((String)stack.peek())) {
                    stack.push(currentElement + "");
                    if(i==charArray.length-1)
                    {
                        while (!stack.isEmpty()) {

                            lastElement = (String)stack.pop();
                            elementCount++;
                        }

                        finalCompressedString += lastElement + "" + elementCount;
                    }else
                    continue;
                }

                else {
                    while (!stack.isEmpty()) {

                        lastElement = (String)stack.pop();
                        elementCount++;
                    }

                    finalCompressedString += lastElement + "" + elementCount;
                    elementCount=0;
                    stack.push(currentElement+"");
                }

            }
        }

        if (finalCompressedString.length() >= input.length())
            return input;
        else
            return finalCompressedString;
    }

}
于 2016-03-06T03:10:33.150 に答える
0

これはリート コードの問題 443 です。ここでの回答のほとんどは StringBuilder または HashMap を使用しています。実際の問題ステートメントは、入力 char 配列を使用して解決し、代わりに配列を変更することです。

public int compress(char[] chars) {
    int startIndex = 0;
    int lastArrayIndex = 0;
    if (chars.length == 1) {
      return 1;
    }
    if (chars.length == 0) {
      return 0;
    }
    for (int j = startIndex + 1; j < chars.length; j++) {
      if (chars[startIndex] != chars[j]) {

        chars[lastArrayIndex] = chars[startIndex];
        lastArrayIndex++;
        if ((j - startIndex) > 1) {
          for (char c : String.valueOf(j - startIndex).toCharArray()) {
            chars[lastArrayIndex] = c;
            lastArrayIndex++;
          }
        }
        startIndex = j;
      }
      if (j == chars.length - 1) {
        if (j - startIndex >= 1) {
          j = chars.length;
          chars[lastArrayIndex] = chars[startIndex];
          lastArrayIndex++;
          for (char c : String.valueOf(j - startIndex).toCharArray()) {
            chars[lastArrayIndex] = c;
            lastArrayIndex++;
          }
        } else {
          chars[lastArrayIndex] = chars[startIndex];
          lastArrayIndex++;
        }
      }
    }
    return lastArrayIndex;
  }
}
于 2022-01-27T21:49:00.947 に答える
0

以下のコードは、出現回数をカウントするために特定の文字を入力するようユーザーに要求します。

import java.util.Scanner;

class CountingOccurences {

public static void main(String[] args) {

    Scanner inp = new Scanner(System.in);

    String str;
    char ch;
    int count=0;

    System.out.println("Enter the string:");
    str=inp.nextLine();
    System.out.println("Enter th Char to see the occurence\n");
    ch=inp.next().charAt(0);

    for(int i=0;i<str.length();i++)
    {
                if(str.charAt(i)==ch)
        {
            count++;
                }
    }

        System.out.println("The Character is Occuring");
        System.out.println(count+"Times");


}

}
于 2015-08-14T07:29:31.873 に答える