首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >构造两个字符的模式(例如:"aabba","aba")

构造两个字符的模式(例如:"aabba","aba")
EN

Stack Overflow用户
提问于 2019-08-09 15:06:29
回答 2查看 109关注 0票数 3

建议一种有效的方法,在给定两个字符(例如:x = 5, y = 4)的出现频率的情况下,使用两个字符(例如:"aabba","aba")的模式构建String。问题是任何字符都不应该重复两次以上。

示例测试用例:

代码语言:javascript
复制
|  X  |  Y  | Output     |
| --- | --- | ---------- |
|  3  |  2  | aabab      |
|  2  |  1  | aab        |
|  4  |  6  | bbabbababa |
|  4  |  4  | abababab   |

我写了一个贪婪的方法,如下所示:

代码语言:javascript
复制
public static String getPatternStr(int x, int y){
    String result = "";
    List<String> list = new ArrayList<>();
    int secondIterationIndex = 0;

    int moreCharCount = (x > y)? x : y;
    int lessCharCount = (x < y)? x : y;


    String moreChar = (x > y)?"a":"b";
    String lessChar = (x < y)?"a":"b";

    if(x == y){
        moreCharCount = lessCharCount = x;
        moreChar = "a";
        lessChar = "b";
    }

    for(int i = 1; i <= (x+y); i++){
        if(lessCharCount > 0){
            if(i%2 == 1){
                list.add(moreChar);
                moreCharCount--;
            }
            else{
                list.add(lessChar);
                lessCharCount--;
            }
        }else{
            list.add(secondIterationIndex,moreChar);
            secondIterationIndex += 3;
            if(secondIterationIndex > list.size()){
                secondIterationIndex = list.size()-1; 
            }
        }
        //System.out.println(list);
    }
    for(String e: list){
        result += e;
    }
    return result;
}

这种方法看起来既繁琐又不优雅。有什么更好更有效的方法吗?

编辑:我坚信有一种方法使用这些(x和y)数字,我们可以计算出双a,双b,单a和单b的数量,甚至在循环开始之前。只得到了一个部分工作的逻辑。

代码语言:javascript
复制
public static String patternStr(int x, int y){
    String result = "";

    int large = (x > y)? x : y;
    int small = (x < y)? x : y;


    int pairsOfLarge = large/2;
    int largeParts = pairsOfLarge + large%2;

    int minSmallParts = (largeParts>1)? (largeParts-1):1;
    int pairsOfSmall = small - minSmallParts;
    int smallParts = pairsOfSmall + (small - (pairsOfSmall*2));
    // System.out.println("minSmallParts="+minSmallParts+" pairsOfSmall="+pairsOfSmall+" smallParts="+smallParts);

    String odd = (large == x)?"a":"b";
    String even = (small == x)?"a":"b";

    int i = 1;
    while((largeParts + smallParts) > 0){
        if(i%2 > 0){
            if(pairsOfLarge > 0){
                result += odd + odd;
                pairsOfLarge--;
            }else{
                result += odd;
            }
            largeParts--;
        }else{
            if(pairsOfSmall > 0){
                result += even + even;
                pairsOfSmall--;
            }else{
                result += even;
            }
            smallParts--;
        }
        i++;
    }
    return result;
}
EN

回答 2

Stack Overflow用户

发布于 2019-08-09 19:04:22

这对我来说更优雅(算法的工作原理与之类似):

代码语言:javascript
复制
static String getPatternStr(int x, int y){
    int lessCharCount = Math.min(x,y);
    int moreCharCount = Math.max(x,y);
    String moreChar = "a";
    String lessChar = "b";
    if(lessCharCount < (moreCharCount + 1) / 2 - 1)
      return "";
    if(lessCharCount == 1 && moreCharCount == 1)
      return moreChar + lessChar;
    LinkedList<String> result = new LinkedList<>(Arrays.asList(moreChar.repeat(moreCharCount).split("")));
    for(int i = 2; lessCharCount > 0; i = (i + 3) % (++moreCharCount)){
      result.add(i,lessChar);
      lessCharCount--;
    }
    return result.stream().collect(Collectors.joining(""));
  }

没有太多的效率提升,只是使用了LinkedList而不是ArraysList,前者更适合于插入操作。

票数 1
EN

Stack Overflow用户

发布于 2019-08-09 21:29:44

如果您找到重复字符,例如:"bbabbababa“。

代码语言:javascript
复制
String value = "bbabbababa";
    ArrayList<Character> charList = new ArrayList<>();

    value.chars()
        .forEach(e -> charList.add((char) e));

    System.out.println("b : " + Collections.frequency(charList, 'b'));

输出: b:6

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57424992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档