C 查找列表中重复的对数

C 查找列表中重复的对数,c,arrays,string,char,repeat,C,Arrays,String,Char,Repeat,给定任意的char[]查找字符串中的字符对数。因此,这将是3: aabbcc 如果两对相同字符相邻,则应计算两对字符。因此,这将是3: aaaabb 中断的单个字符必须重置连续字符对的计数。这就是1: 亚伯克 如果中断的单个字符与前一个字符对相同,则不会重置连续字符对的计数。因此,这将是3: aabbbccc 这是一个改编自。对这个问题的最初解释很有趣,但评论不断改变这个问题的性质,使其与最初的解释不同。如果I是最后一个元素的索引,那么循环控制应该使用数组的大小作为范围,并且a[I+1]的索引

给定任意的
char[]
查找字符串中的字符对数。因此,这将是3:

aabbcc

如果两对相同字符相邻,则应计算两对字符。因此,这将是3:

aaaabb

中断的单个字符必须重置连续字符对的计数。这就是1:

亚伯克

如果中断的单个字符与前一个字符对相同,则不会重置连续字符对的计数。因此,这将是3:

aabbbccc



这是一个改编自。对这个问题的最初解释很有趣,但评论不断改变这个问题的性质,使其与最初的解释不同。如果
I
是最后一个元素的索引,那么循环控制应该使用数组的大小作为范围,并且
a[I+1]
的索引可能是不受限制的,因此使用
a[I-1]
代替并在范围内迭代[
1
sizeof(a)/sizeof(a[0])
]更可取

该算法最好用3个变量求解:

  • char*last
    指向当前连续字符字符串的第一个元素
  • int count1
    当前计数中的连续对数
  • int count
    记录的最大连续对数
该算法最好用状态机来说明。它将在以下情况下运行:

  • 输入时,将
    last
    设置为
    NULL
    ,如果
    count1
    大于
    count
    count1
    分配给
    count
    ,并将
    count1
    重置为
    0
  • 输入时,将
    last
    设置为此连续字符字符串中的第一个字符(
    a[i-1]
  • 输入时,将最后一个字符所指向的连续字符数除以2,以便仅查找成对字符
  • 这是内联注释的更正代码:

    size_t i = 0;
    char* last = NULL;
    long int count1 = 0;
    long int count = 0;
    char a[] = {'d', 'p', 'p', 'c', 'c', 'd', 'd', 'd'};
    
    while (++i < sizeof(a) / sizeof(a[0])) { // This will iterate over the range: [1 .. sizeof(a) / sizeof(a[0])]
        if (a[i - 1] == a[i]) { // Test previous character to avoid going out of range
            if (last == NULL) { // Entry to state 2
                last = a + i - 1;
            }
        } else if (last != NULL) {
            if (a + i - last > 1) { // Entry to state 3 
                count1 += (a + i - last) / 2;
                last = a + i;
            } else { // Entry to state 1
                if (count1 > count) { // If the current count is larger
                    count = count1; // Replace the maximum count
                }
                count1 = 0; // Reset the current count
                last = NULL;
            }
        }
    }
    
    if (last != NULL) { // Entry to state 3
        if (a + (sizeof(a) / sizeof(a[0])) - last > 1) {
            count1 += (a + (sizeof(a) / sizeof(a[0])) - last) / 2;
        }
    
        if (count1 > count) { // If the current count is larger
            count = count1; // Replace the maximum count
        }
    }
    
    printf("%ld", count);
    
    size\u t i=0;
    char*last=NULL;
    长整数计数1=0;
    长整数计数=0;
    字符a[]={'d','p','p','c','c','d','d','d'};
    而(++i1){//进入状态3
    count1+=(a+i-最后一次)/2;
    last=a+i;
    }else{//进入状态1
    如果(count1>count){//如果当前计数较大
    count=count1;//替换最大计数
    }
    count1=0;//重置当前计数
    last=NULL;
    }
    }
    }
    如果(last!=NULL){//进入状态3
    如果(a+(sizeof(a)/sizeof(a[0])-last>1){
    count1+=(a+(sizeof(a)/sizeof(a[0])最后一次)/2;
    }
    如果(count1>count){//如果当前计数较大
    count=count1;//替换最大计数
    }
    }
    printf(“%ld”,计数);
    

    []

    您将i声明为int,但您正在将其与一个非singned(sizeof)进行比较,然后count被声明为int,这里count1+=(a+i-last)/2;**错误:从“long int”转换为“int”可能会改变其属性value@Michi有趣的是,在64位机器上转换失败是有道理的。我想一定是32位的,因为我没有任何问题。无论是哪种情况,我相信我已经解决了,谢谢你的提示。上传你如何解释它,是的,现在com好的。