从给定字符串仅打印3个连续字符

时间:2018-08-06 06:01:28

标签: java string char

我只想从给定的字符串中打印3个相同的连续字符,如下所示 如果输入是:

"aasssfddddvvv"

然后我应该将输出作为输出:

sss
vvv 
count=2

这是我的要求,请帮助我。

我的代码:

import java.util.Scanner;

class Test {

    public static void main(String args[]) {
        Scanner scan = new Scanner(System.in);
        System.out.println("Enter the String: ");
        char s[] = scan.nextLine().toCharArray();

        for (int i = 0; i < s.length - 1; i++) {

            if (s[i] == s[i + 1] && s[i] == s[i + 2] && s[i] == s[i + 3]) {
                System.out.println(s[i]);

            }
        }
        scan.close();
    }
}

7 个答案:

答案 0 :(得分:3)

此答案与OP中使用的更手动的方法有所不同。但是,使用Java中的正则表达式模式匹配器处理起来非常简单。我们可以在模式(.)\\2*上进行匹配,以捕获所有相似字母的组。然后,仅打印出出现为3的组。

String line = "aasssfddddvvv";
String pattern = "((.)\\2*)";
Pattern r = Pattern.compile(pattern);
Matcher m = r.matcher(line);

while (m.find()) {
    if (m.group(1).length() == 3) {
        System.out.println(m.group(1));
    }
}

sss
vvv

Demo

答案 1 :(得分:2)

第一个问题是,您试图在中达到的数组的第二个索引长度。

假设字符串长度为5

0:  0 1 2
1:  1 2 3
2:  2 3 4
3:  3 4 (5)
4:  4 **(5) (6)**

如您所见,您尝试达到 5 ,它不是字符串的一部分。所以尝试

for (int i = 0; i < s.length - 2; i++)

代替

for (int i = 0; i < s.length - 1; i++)

提示:您可以从错误中获取此信息。

  

线程“主”中的异常java.lang.ArrayIndexOutOfBoundsException:   13

它说您尝试达到无法达到的索引。

第二个问题,您检查4个字符是否符合条件。使用:

if (s[i] == s[i + 1] && s[i] == s[i + 2])

代替

if (s[i] == s[i + 1] && s[i] == s[i + 2] && s[i] == s[i + 3])

答案 2 :(得分:0)

您无法检查单元格i + 2和i + 3,因为当达到i = length -2时,您将越过数组范围, 您应该对序列进行计数并检查长度是否足够,如果可以打印,那么在您的示例中,您正在比较4个单元格,因此长度将为4而不是3,请在1中开始seq,因为当您读取单个字符时其序列为1:

public function up()
{
    Schema::connection('materials')->create('material_tags', function (Blueprint $table) {
        $table->uuid('uuid')
            ->primary();
        $table->uuid('material_id');
        $table->uuid('tag_id');

        $table->timestamps();

        $table->foreign('material_id')
            ->references('uuid')
            ->on('materials')
            ->onDelete('cascade');
        $table->foreign('tag_id')
            ->references('uuid')
            ->on('tags')
            ->onDelete('cascade');
    });
}

答案 3 :(得分:0)

首先遍历您的char[]数组。然后,在您的if语句中,

  • 首先确保数组中剩余两个以上的字符。
  • 然后将s[i]与下一个字符(s[i+1])和next(s[i+2])之后的字符进行比较

替换这部分代码

for (int i = 0; i < s.length; i++) {
    if (i < s.length - 2 && s[i] == s[i + 1] && s[i] == s[i + 2]) {
        System.out.println(s[i]);
    }
}

答案 4 :(得分:0)

以此替换代码的主要逻辑。 在这里,我们检查是否只有 3个重复字符。通过确保第四个字符不同。

int count=0;
for (int i = 0; i < s.length - 3; i++) {
    if (s[i] == s[i + 1] && s[i] == s[i + 2] && s[i] != s[i + 3]) {
        System.out.println(s[i]+s[i]+s[i]);
        count++;
    }
}
System.out.println("count="+count);

答案 5 :(得分:0)

import java.util.Scanner;
class Test {

    public static void main(String args[]) {
        Scanner scan = new Scanner(System.in);
        System.out.println("Enter the String: ");
        char s[] = scan.nextLine().toCharArray();
        int count=0;

        for (int i = 0; i < s.length - 3; i++) {

            if (s[i] == s[i + 1] && s[i] == s[i + 2] && s[i]!=s[i + 3]) {
                System.out.println(s[i]+s[i]+s[i]);
                count++;
            }
        }
        if(s[s.length - 3] == s[s.length - 2] && s[s.length - 3] == s[s.length - 1]){
            System.out.println(s[s.length]+s[s.length]+s[s.length]);
            count++;
        }
        scan.close();
        System.out.println(count);
    }
}

答案 6 :(得分:0)

似乎您只希望严格计数3个连续字符。如果是这样,即使解决了代码中的问题(没有更改整体逻辑),它也会打印两次ddd。这是固定代码的输出:

sss 
ddd
ddd
vvv
count=4

固定代码的意思是处理这些问题

  1. 比较时间过长,请解决:删除&& s[i] == s[i + 3]
  2. 条件需要调整为i < s.length - 2
  3. 仅打印一个字符(可能不是一个真正的问题)
  4. 每次找到匹配项时添加一个计数器

这是固定代码(请记住,这仍然无法产生所需的正确输出

int occurence_count = 0;
for (int i = 0; i < s.length - 2; i++) {

    if (s[i] == s[i + 1] && s[i] == s[i + 2]) {
        occurence_count++;
        System.out.println(s[i]);
    }
}
System.out.println("count=" + occurence_count);

逻辑上的变化是拥有一个单独的计数器来对连续的字符进行计数,以及一个可以记住最后一个字符的变量。

int char_count = 0;
char last_char = '!';  

基本思想是遍历我们的字符串,如果char_count相同,则增加一个,如果不同,则重置。我们还需要使用一个您不打算用作输入的字符来初始化它,例如!

由于我们要遍历整个字符串,因此需要使用i < s.length结束for循环条件。

重置时(检测到其他字符时),我们还要检查上一个是否具有char_count=3。如果匹配,则增加occurence_count。我们还需要在for循环之后再执行一次此操作,因为对于输入字符串末尾的连续检查可能不会进行检查。这是代码:

    int occurence_count = 0;
    int char_count = 0;
    char last_char = '!';  
    for (int i = 0; i < s.length; i++) {
        if (s[i] != last_char) {                
            if (char_count == 3) {
                occurence_count++;
                System.out.println(""+last_char+last_char+last_char);                   
            }               
            last_char = s[i];
            char_count = 0;
        }

        char_count++;

    }
    if (char_count == 3) {
        occurence_count++;
        System.out.println(""+last_char+last_char+last_char);                   
    }

    System.out.println("count=" + occurence_count);