You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java场景下如何去除字符串中的非相邻重复字符?

如何去除字符串中的非相邻重复字符

需求背景:

  • 生成两个各含5个随机数的数组,找出两数组的共同数字并存入SameNums字符串
  • 需要去除SameNums中的所有重复字符(包括非相邻的重复项),例如:
    • 输入"12355" → 输出"1235"
    • 输入"12928" → 输出"1298"

现有实现代码:

// 创建数组
Random rand = new Random();
int[] first5num = new int[5];
int[] second5num = new int[5];

for (int i = 0; i < 5; i++)
{
    first5num[i] = rand.nextInt(9 + 1);
    System.out.print(" " + first5num[i]);
}

for (int j = 0; j < 5; j++)
{
    second5num[j] = rand.nextInt(9 + 1);
    System.out.print(" " + second5num[j]);
}

// 遍历数组找共同数字
String SameNums = "";
int comparitive;
for (int k = 0; k < 5; k++)
{
    comparitive = first5num[k];
    for (int l = 0; l < 5; l++)
    {
        if (comparitive == second5num[l])
        {
            SameNums += comparitive;
        }
    }
}

已尝试的思路代码:

// 用while循环处理字符串
boolean run = true;
int counter = 0;
int restrict = counter + 1;
String word1, word3;

while (run == true)
{
    if (counter == SameNums.length() - 1)
    {
        run = false;
    }
    if (SameNums.charAt(counter) == SameNums.charAt(restrict))
    {
        word1 = SameNums.substring(0, restrict);
        word3 = SameNums.substring(restrict + 1, SameNums.length());
        SameNums = word1 + word3;
        counter++;
        restrict = counter + 1;
        continue;
    }
}

解决方案

方法1:构建字符串时直接去重(更高效)

不需要先把所有重复项加入字符串再处理,而是在添加前判断数字是否已存在,避免重复写入:

String SameNums = "";
int comparitive;
for (int k = 0; k < 5; k++)
{
    comparitive = first5num[k];
    // 先判断当前数字是否已在结果中,避免重复添加
    if (SameNums.indexOf(String.valueOf(comparitive)) == -1) {
        for (int l = 0; l < 5; l++)
        {
            if (comparitive == second5num[l])
            {
                SameNums += comparitive;
                break; // 找到匹配就退出内层循环,避免重复添加同一数字
            }
        }
    }
}

方法2:用Set集合去重(简洁可靠)

利用Set的元素唯一性特性,先存储共同数字再转成字符串:

Set<Character> uniqueChars = new HashSet<>();
int comparitive;
for (int k = 0; k < 5; k++)
{
    comparitive = first5num[k];
    for (int l = 0; l < 5; l++)
    {
        if (comparitive == second5num[l])
        {
            uniqueChars.add((char)(comparitive + '0')); // 将int转为对应字符
            break;
        }
    }
}
// 把Set转为字符串
StringBuilder sb = new StringBuilder();
for (char c : uniqueChars) {
    sb.append(c);
}
String SameNums = sb.toString();

方法3:修复原while循环逻辑

如果坚持用字符串遍历去重,补充完整逻辑避免死循环:

int counter = 0;
while (counter < SameNums.length()) {
    char current = SameNums.charAt(counter);
    // 从当前位置下一位开始查找重复字符
    int duplicateIndex = SameNums.indexOf(current, counter + 1);
    if (duplicateIndex != -1) {
        // 删除重复字符
        SameNums = SameNums.substring(0, duplicateIndex) + SameNums.substring(duplicateIndex + 1);
    } else {
        // 无重复则移动到下一个字符
        counter++;
    }
}

说明

  • 方法1和2在构建结果阶段就避免了重复,比事后处理字符串的效率更高
  • Set集合的方式代码简洁,能天然保证元素唯一性,推荐使用

内容的提问来源于stack exchange,提问作者CodeGeek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 07:11:05