请解释这种置换算法的工作原理以及该回文算法的工作原理

时间:2015-07-04 02:04:52

标签: c algorithm

因此,假设这个函数是如何工作的,如果n2是n1的排列,它假设返回1.如果可以通过重新排列n1的数字形成n2,则n2是n1的排列。 (I.E.237654是743526的排列)。

我不明白如果有人能逐行解释会发生什么我会很感激,谢谢。

int is_permutation_division (unsigned long n1, unsigned long n2) 

{
    int a[10] = {0,0,0,0,0,0,0,0,0,0};
    size_t i;

    while (n1 != 0)
    {
        a[n1 % 10]++; // Edit: little syntax error
        n1 /= 10;
    }

    while (n2 != 0)
    {
        a[n2 %10]--;
        n2 /= 10;
    }

    for (i=0; i<10; i++)
    {
        if (a[i] != 0)
        {
            return 0;
        }
    }
    return 1; 
}

下一个函数测试字符串是否是回文序列。一个单词是回文,如果它拼写向后(即赛车rac ecar)时它是相同的

我对我评论的一行有疑问。我只是想知道它的j-1是否因为你不想处理空字符

int is_palindrome(const char s[])

{
size_t i,j;

for (i=0; j<strlen(s); i<j; i++; j--)
{
    if(s[i] != s[j-1]) /*is it j-1 because you don't want to check the null character? */
    {
        return 0;
    }
}
return 1;
}

3 个答案:

答案 0 :(得分:0)

回文确实是为了避免检查空字符。

答案 1 :(得分:0)

while (n1 != 0)
{
    a[n1 % 10]++; // adds one to the array position of last digit. i.e: 42235 -> a[5] goes up by 1.
    n1 /= 10; //deletes last number. i.e: 42235 -> 4223 
}

这使得a成为一个数组,每个a[i](第i个位置)包含数字i出现在数字上的次数。例如,对于n1 = 1233210346576a将为{1, 2, 2, 3, 1, 1, 2, 1, 0, 0}

然后,以下部分执行相同但减少数组。我们的数字是一个排列iff a再次是一个0的数组。

对于第二个,老实说我不明白......如果for循环可以分为5个条款,我不知道......但基本上,你想要比较第i个左边的字母和右边的第i个字母,我从第一个字母到总金额的一半。可能会有一些+ -1s来实现它。

答案 2 :(得分:0)

  • is_permutation_division函数中,

    //assume n1 = 237654, n2 = 743526
    
    int is_permutation_division (unsigned long n1, unsigned long n2)
    {
    int a[10]  =  {0,  0,  0,  0,  0,  0,  0,  0,  0,  0};
    //             ^   ^   ^   ^   ^   ^   ^   ^   ^   ^
    //calc num of '0' '1' '2' '3' '4' '5' '6' '7' '8' '9' symbols of n1
    size_t i;
    
    while (n1 != 0)
    {
        a[n1 % 10]++; //a[0] keeps num of '0', a[1] keeps num of '1',...of n1
        n1 /= 10;
    }// now, a[] = {0,0,1,1,1,1,1,1,0,0}, for n1 = 237654
    
    while (n2 != 0)
    {
        a[n2 %10]--;// to check the count of '0','1','2'... of n2 
        n2 /= 10;
    }//now, a[] = {0,0,0,0,0,0,0,0,0,0}, since n2 = 743526
     //because, n2 has the same digital symbol array, 
     //all elements of a[] would be 0 by count back
    
    for (i=0; i<10; i++)
    {
        if (a[i] != 0)
        {
            return 0;//if there is a non zero element, not permutation, return
        }
    }// now, a[] is full of 0
    return 1;//then n2 is permutation of n1 
    }  
    
  • is_palindrome函数中,

    for (i=0; j<strlen(s); i<j; i++; j--) //这里有些问题

    它应该是:

    for (i=0, j = strlen(s); i<j; i++, j--)