我只想从给定的字符串中打印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();
}
}
答案 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
答案 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
固定代码的意思是处理这些问题
&& s[i] == s[i + 3]
。i < s.length - 2
这是固定代码(请记住,这仍然无法产生所需的正确输出)
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);