240512.LeetCode——2396.严格回文的数字

题目描述

如果一个整数 n 在 b 进制下(b 为 2 到 n - 2 之间的所有整数)对应的字符串 全部 都是 回文的 ,那么我们称这个数 n 是 严格回文 的。

给你一个整数 n ,如果 n 是 严格回文 的,请返回 true ,否则返回 false 。

如果一个字符串从前往后读和从后往前读完全相同,那么这个字符串是 回文的 。

EX1.

b1b7896fae47487f82336e574355cc5f.jpg

EX2.

02def5d126304bb09da116e0a84ab1a2.jpg 

提示

  • 4 <= n <= 105

代码实现

C语言

bool isStrictlyPalindromic(int n)
{
    int i;
    int j;
    int k;//三个循环变量
    int cnt;//一个数字在不同进制的位数
    int tmp;//临时变量
    for (i=2;i<n-1;i++)//一个大循环,循环不同进制
    {
        cnt=0;
        for(j=n;j>=1;)//第一个循环计算进制数字的位数(注意这里把循环变量的变化移到了循环体内)
        {
            tmp=j-j%i;
            j=tmp/i;
            cnt++;
        }
        int *num=(int*)malloc(sizeof(int)*cnt);//动态分配数组来记录进制数的各个位数
        j=n;
        for(k=0;k<cnt;k++)//除i取余法实现十进制转化为i进制
        {
            num[k]=j%i;
            j=(j-num[k])/i;
        }
        for(k=0;k<cnt;k++)//实现回文判断...一整个函数最简单的part
        {
            if (num[k]!=num[cnt-1-k])
            {

                free(num);
                return false;
            }
        }
        free(num);//动态数组是自己定义的,要自己free...
    }
    return true;
}

执行结果

cd377e022c044dd9be5ab138c69402b9.jpg 

思路

      这个题是真的不会,倒不是题目看不懂,是操作上涉及了一个我不太熟悉的点就是,进制转换...这个在现实中就不是很熟练,更别说转换成代码了。只记起来大概是叫做除k取余法?但是代码实现还是很痛苦的。刚刚看了很多的题解,下面自己敲一下吧...

      for(i=n;i>=1;)

      {num[j]=i%k;i=(i-num[j])/k;}

      用%符号来得到当前最低位的进制数,然后迭代更新去掉最低位的进制数,直到i<=0。

      然后用的代码是题解区粘贴的,然后自己理解了,修改了一下代码规范,交上去执行用时0ms?这个思路大概是用了一个大循环来循环所有进制。在大循环里先用一个循环来判断这个数的某一进制数有几位,然后根据这个结果来动态规划数组,然后第二个循环就把所有的进制数字记录在数组里。注意这里用的是数字数组,但是貌似AI给出的和网上的有用字符串的,后面也好来判断回文。我个人认为两种都很好,但是要注意用字符串的时候要注意如果直接用ASCII码转换过去会是其他字符,要用‘0’来作为相对量来实现。然后最后的一个循环就是判断回文,这个回文我估计是整个程序最好理解也最好实现的子处理了。最后还是别忘了free数组。噢对了,这个程序是用多出口(两个return),这个其实不是很提倡,但为了简便,鉴于程序的大小还是用了,实际上在大型软件开发中要用一个sign来表示出口与否,然后加入选择逻辑,还是要归结到单出口为好,像这个代码如果用多出口就会导致free的重复,如果不重复就会导致有的情况无法释放内存。btw,附上一个脑筋急转弯版本。

C语言(脑筋急转弯)

bool isStrictlyPalindromic(int n)
{
    return false;//直接输出false
}

执行情况
02ca4fcd191b4d9cb128f7fe029a8c5d.jpg

 思路

思路就是没有思路...在题解区看到的,大佬们一本正经的分析出来,当数大于4的时候,所有的n-2进制都是12。4的二进制又是100,所以所有的数肯定不回文,所以肯定输出false。直接输出就完事...实现没有技术含量...重点在能不能先理论分析...最后执行结果也是100+17,比完全模拟高...

总结

       今天的第二道题...上来就看懵逼了,还是遍历所有进制...这就麻烦了,当然我想到了循环,但这个实现相当于用到了四个循环。所以啊,循环还得好好学,而且这份代码顺带复习了进制转换,还有储存进制数字的方式,数字数组或者字符串。而且也是用到了动态规划,还是很综合的一道题(不用脑筋急转弯的话...)。

        一个上午四节课写完两道题,把昨天补了,今天写了...上课没听多少...继续沉淀!!!

  • 30
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值