Java 严格的算法-不要让相同的字符重复n个位置

Java 严格的算法-不要让相同的字符重复n个位置,java,algorithm,Java,Algorithm,因为我不知道如何计算“插入”下划线,所以我无法计算出这一点。我包括了我解决这个问题的尝试 给定一个字符串,不要让同一个字符重复n个位置。如果确实重复,请插入要推送的下划线 它向下移动X个位置。所需的最终输出只是字符总数 例1)输入“QQ”,2变为“Q_uuuq”,返回值为4 例2)输入“ABCA”,2变为“ABCA”(不需要空格),总字符数为4 例3)输入“DEDEE”,1变为“DEDE_E”,总字符数为6 例4)输入“JKJK”,2变为“JK_JK”,字符总数为5(最难的示例) impor

因为我不知道如何计算“插入”下划线,所以我无法计算出这一点。我包括了我解决这个问题的尝试

给定一个字符串,不要让同一个字符重复n个位置。如果确实重复,请插入要推送的下划线 它向下移动X个位置。所需的最终输出只是字符总数

  • 例1)输入“QQ”,2变为“Q_uuuq”,返回值为4
  • 例2)输入“ABCA”,2变为“ABCA”(不需要空格),总字符数为4
  • 例3)输入“DEDEE”,1变为“DEDE_E”,总字符数为6
  • 例4)输入“JKJK”,2变为“JK_JK”,字符总数为5(最难的示例)
import java.lang.Math;
导入java.util.HashMap;
导入java.util.ArrayList;
公共类间隔器{
公共静态void main(字符串参数[]){
System.out.println(“QQ,2=“+spacey(“QQ,2)+”,预期为4”);
System.out.println(“ABCA,2=“+spacey(“ABCA,2)+”,预期为4”);
System.out.println(“DEDEE,1=“+spacey(“DEDEE,1)+”,预期为6”);
System.out.println(“JKJK,2=“+spacey(“JKJK,2)+”,预期为5”);
}
私有静态int-spacey(字符串字,int-spaces){
//int-shift=0;
HashMap hm=新的HashMap();

对于(int i=0;i首先,您的一个测试用例中有一个错误。假设您希望在引用的质询中重现这些用例,您需要一个1作为调用
spacey
的第二个参数,如下所示:

    System.out.println("DEDEE,1 = " + spacey("DEDEE", 1) + ", expected 6");
    //                        ^                       ^
计算要插入的下划线数的公式为:

    previousindex + n + 1 - i
…其中previousindex是当前字母之前出现的索引,i是当前索引

您可以使用
.repeat
string方法重复下划线。以后不要忘记更新i,这样它会一直指向当前处理的字符(向前移动)

因此,您的代码可以这样工作:

import java.lang.Math;
import java.util.HashMap;
import java.util.ArrayList;

public class Spacer {
    public static void main (String args[]) {
        System.out.println("QQ,2 = " + spacey("QQ", 2) + ", expected 4");
        System.out.println("ABCA,2 = " + spacey("ABCA",2) + ", expected 4");
        System.out.println("DEDEE,1 = " + spacey("DEDEE", 1) + ", expected 6");
        System.out.println("JKJK,2 = " + spacey("JKJK", 2) + ", expected 5");
    }

    private static int spacey(String word, int spaces) {
        HashMap<Character, Integer> hm = new HashMap<>();
        for (int i=0; i<word.length(); i++) {
            char letter = word.charAt(i);
            if (hm.get(letter) == null) {
                hm.put(letter, i);
            } else {
                int underscores = hm.get(letter) + spaces + 1 - i;
                if (underscores > 0) { // Need to add underscores
                    word = word.substring(0, i) + "_".repeat(underscores) + word.substring(i);
                    i += underscores; // update i so it still points to the current character
                }
                hm.put(letter, i);
            }
        }
        return word.length();
    }
}
import java.lang.Math;
导入java.util.HashMap;
导入java.util.ArrayList;
公共类间隔器{
公共静态void main(字符串参数[]){
System.out.println(“QQ,2=“+spacey(“QQ,2)+”,预期为4”);
System.out.println(“ABCA,2=“+spacey(“ABCA,2)+”,预期为4”);
System.out.println(“DEDEE,1=“+spacey(“DEDEE,1)+”,预期为6”);
System.out.println(“JKJK,2=“+spacey(“JKJK,2)+”,预期为5”);
}
私有静态int-spacey(字符串字,int-spaces){
HashMap hm=新的HashMap();
对于(inti=0;i0){//需要添加下划线
word=word.substring(0,i)+“u.”重复(下划线)+word.substring(i);
i+=下划线;//更新i,使其仍然指向当前字符
}
hm.put(字母,i);
}
}
返回word.length();
}
}

首先,您的一个测试用例中有一个错误。假设您想在引用的质询中重现这些用例,您需要一个1作为调用
spacey
的第二个参数,如下所示:

    System.out.println("DEDEE,1 = " + spacey("DEDEE", 1) + ", expected 6");
    //                        ^                       ^
计算要插入的下划线数的公式为:

    previousindex + n + 1 - i
…其中previousindex是当前字母之前出现的索引,i是当前索引

您可以使用
.repeat
string方法重复下划线。以后不要忘记更新i,这样它会一直指向当前处理的字符(向前移动)

因此,您的代码可以这样工作:

import java.lang.Math;
import java.util.HashMap;
import java.util.ArrayList;

public class Spacer {
    public static void main (String args[]) {
        System.out.println("QQ,2 = " + spacey("QQ", 2) + ", expected 4");
        System.out.println("ABCA,2 = " + spacey("ABCA",2) + ", expected 4");
        System.out.println("DEDEE,1 = " + spacey("DEDEE", 1) + ", expected 6");
        System.out.println("JKJK,2 = " + spacey("JKJK", 2) + ", expected 5");
    }

    private static int spacey(String word, int spaces) {
        HashMap<Character, Integer> hm = new HashMap<>();
        for (int i=0; i<word.length(); i++) {
            char letter = word.charAt(i);
            if (hm.get(letter) == null) {
                hm.put(letter, i);
            } else {
                int underscores = hm.get(letter) + spaces + 1 - i;
                if (underscores > 0) { // Need to add underscores
                    word = word.substring(0, i) + "_".repeat(underscores) + word.substring(i);
                    i += underscores; // update i so it still points to the current character
                }
                hm.put(letter, i);
            }
        }
        return word.length();
    }
}
import java.lang.Math;
导入java.util.HashMap;
导入java.util.ArrayList;
公共类间隔器{
公共静态void main(字符串参数[]){
System.out.println(“QQ,2=“+spacey(“QQ,2)+”,预期为4”);
System.out.println(“ABCA,2=“+spacey(“ABCA,2)+”,预期为4”);
System.out.println(“DEDEE,1=“+spacey(“DEDEE,1)+”,预期为6”);
System.out.println(“JKJK,2=“+spacey(“JKJK,2)+”,预期为5”);
}
私有静态int-spacey(字符串字,int-spaces){
HashMap hm=新的HashMap();
对于(inti=0;i0){//需要添加下划线
word=word.substring(0,i)+“u.”重复(下划线)+word.substring(i);
i+=下划线;//更新i,使其仍然指向当前字符
}
hm.put(字母,i);
}
}
返回word.length();
}
}
你的问题是(主要是)关于插入下划线。一个有助于向前发展的关键洞察是,输入和输出字符串是不同的,因此使用一个例子来处理它们会更干净。此外,在这个阶段使用临时变量来捕获字符之间的距离等概念也没有什么坏处。利用这两个概念u可以有更多自解释的代码,例如:

public static String space(String input, int spaces) {
    HashMap<Character, Integer> map = new HashMap<>();
    StringBuilder result = new StringBuilder();
    for( char symbol : input.toCharArray() ) {
        int position = result.length();
        int lastPosition = map.getOrDefault(symbol, position-spaces-1);
        int distance = position - lastPosition -1;
        for( int j = 0; j < Math.max( spaces - distance, 0) ; j++ ) {
            result.append('_');
        }
        result.append(symbol);
        map.put(symbol, result.length()-1);
    }
    return result.toString();
}
公共静态字符串空间(字符串输入,整数空间){
HashMap=newHashMap();
StringBuilder结果=新建StringBuilder();
for(字符符号:input.toCharArray()){
int position=result.length();
int lastPosition=map.getOrDefault(符号,position-spaces-1);
int距离=位置-lastPosition-1;
对于(int j=0;j
(一旦掌握并消化了这一点,当然就有可能与临时工保持一致)

你的问题是(主要是)关于插入下划线。一个有助于向前发展的关键洞察是,输入和输出字符串是不同的,因此使用一个示例来处理它们会更干净。此外,在这个阶段使用临时变量来捕获字符之间的距离等概念也没有什么坏处。Lever