csthh 2023-11-17 15:26 采纳率: 62.5%
浏览 6

如何理解if(i==k)?

这个关于回文交换字符的代码里面

#include<stdio.h>
#include<string.h>

int main()
{
    int n,i,sum=0;
    scanf("%d",&n);
    getchar();
    char a[n];
    gets(a);
    int b[26]={0};
    for(i=0;i<n;i++)
    {
        b[a[i]-'a']++;
    }
    int t=0;
    for(i=0;i<26;i++)
    {
        if(b[i]%2!=0)
        t++;
    }
    if(t>=2)
    {
        printf("Impossible");
    }
    else
    {
        int j=n;
        for(i=0;i<(n+1)/2;i++)
        {
            int k;
            for(k=j-1;k>i;k--)
            {
                if(a[i]==a[k])
                {
                    while(k<j-1)
                    {
                        char temp=a[k];
                        a[k]=a[k+1];
                        a[k+1]=temp;
                        k++;
                        sum++;
                    }
                    j--;
                    break;
                }
            }
            if(i==k)
            sum+=(n-1)/2-i;
            
        }
    printf("%d",sum);
    }
    return 0;
}


最后if(i==k)是如何判断出来的,前面是k的量在for里面并且k没有初始化过,为什么最后存在i==k的情况呢?

  • 写回答

2条回答 默认 最新

  • Helloorld_11 2023-11-17 15:31
    关注

    在这段代码中,if(i==k)是一个判断条件,其作用是:

    这段代码的主要目的是删除一个字符串中连续重复的字符,并计算删除的总字符数。

    具体来说,对于输入的字符串,它首先统计了每个字符的出现次数(存储在b[]数组中)。然后,如果一个字符出现次数是奇数次,那么这个字符就会在最终的字符串中出现一次;如果一个字符出现次数是偶数次,那么这个字符就不会出现在最终的字符串中。

    if(i==k)这个判断条件是用来判断a[i]和a[k]是否相同的。如果相同,说明这两个字符是连续重复的,需要删除。此时,while(k<j-1)循环会删除连续重复的字符,并更新sum(累计删除的字符数)和j(当前处理的字符位置)。然后跳出循环,继续处理下一个字符。

    如果a[i]和a[k]不同,那么说明当前字符没有连续重复的,直接跳出循环,继续处理下一个字符。

    这段代码的目标是尽可能地减少删除的字符数,即尽可能地保留原始字符串中的信息。因此,如果有连续重复的字符,那么删除这些字符可以使得字符串更短。

    评论

报告相同问题?

问题事件

  • 创建了问题 11月17日