题目描述
如果一个整数 n
在 b
进制下(b
为 2
到 n - 2
之间的所有整数)对应的字符串 全部 都是 回文的 ,那么我们称这个数 n
是 严格回文 的。
给你一个整数 n
,如果 n
是 严格回文 的,请返回 true
,否则返回 false
。
如果一个字符串从前往后读和从后往前读完全相同,那么这个字符串是 回文的 。
EX1.
EX2.
提示
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;
}
执行结果
思路
这个题是真的不会,倒不是题目看不懂,是操作上涉及了一个我不太熟悉的点就是,进制转换...这个在现实中就不是很熟练,更别说转换成代码了。只记起来大概是叫做除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](https://img-blog.csdnimg.cn/02ca4fcd191b4d9cb128f7fe029a8c5d.jpg)
思路
思路就是没有思路...在题解区看到的,大佬们一本正经的分析出来,当数大于4的时候,所有的n-2进制都是12。4的二进制又是100,所以所有的数肯定不回文,所以肯定输出false。直接输出就完事...实现没有技术含量...重点在能不能先理论分析...最后执行结果也是100+17,比完全模拟高...
总结
今天的第二道题...上来就看懵逼了,还是遍历所有进制...这就麻烦了,当然我想到了循环,但这个实现相当于用到了四个循环。所以啊,循环还得好好学,而且这份代码顺带复习了进制转换,还有储存进制数字的方式,数字数组或者字符串。而且也是用到了动态规划,还是很综合的一道题(不用脑筋急转弯的话...)。
一个上午四节课写完两道题,把昨天补了,今天写了...上课没听多少...继续沉淀!!!