中心对称数进阶

#中心对称数

0.题目描述
找到在[“Low”,“High”]之间的所有中心对称数,因为Low、High可能比较大所以用字符串表示。

1.解题思路
1.借用之前做的找n位数有多少个中心对称数的算法findStrobogrammatic(int n);
https://blog.csdn.net/o_thing/article/details/109448434大家可以康康我前面一篇blog写的关于找n位数中所有的中心对称数

2.解题思想
a.先考虑一般情况,在low和high相隔比较大的情况,将low和high之间的那些位数独立出来,然后依次调用findStrobogrammatic(int n)累加个数;
b.再考虑分别计算low和high这个位数对应findStrobogrammatic(int n)找到的数组中,不小于low的和不大于high的所有数之和(例如low的位数为3,high的位数为5,就分别找f(3)和f(5)返回数组中不小于low的和不大于high的所有数之和)在累加上去;
c.考虑特殊情况:low和high的位数相等,怎么避免重复计算个数;
d.考虑不合法的情况:比如low的位数大于high的位数,low的值大于high的值,给的string为"";

3.算法

代码
vector<string>reduceNum(int n,int len) {
vector<string>vec;
if (n==0)
{
vec.push_back("");
return vec;
}
if (n==1)
{
vec.push_back("0");
vec.push_back("1");
vec.push_back("8");
return vec;
}
vec = reduceNum(n - 2,len);
vector<string>res;
for (auto x:vec)
{
if (n!=len)
res.push_back("0" + x + "0");//n=len表示到达数字的首尾,而首尾不能为0;
res.push_back("1" + x + "1");
res.push_back("6" + x + "9");
res.push_back("8" + x + "8");
res.push_back("9" + x + "6");
}
return res;
}

vector<string> findStrobogrammatic(int n) {
vector<string>vec = reduceNum(n, n);
return vec;
}

int strobogrammaticInRange(string low, string high) {
int ans = 0;
int n1 = low.length(), n2 = high.length();
double Low=0,High=0;
if (low == "" || high == "" || n1 > n2) return 0;
for (int i = 0; i < std::max(n1,n2); i++)//将Low和High换成数字
{
if (i < n1)
Low = Low * 10+(low.at(i)-'0');//使用string.at()方法将定位char字符然后-'0'得到数值
if (i < n2)
High = High * 10 + (high.at(i)-'0');
}
if (Low > High)return 0;
for (int i =n1+1; i < n2; i++)//现将n1+1到n2-1长度的加进去,然后单独考虑n1\n2
{
ans += findStrobogrammatic(i).size();
}
int count = 0;
vector<string>vec = findStrobogrammatic(n1);
if (n1 == n2) {
for (auto x : vec)
{
double val = 0;
for (int i = 0; i < n1; i++)
{
val = val * 10 + (x.at(i) - '0');
}
if (val<Low||val>High) count++;//在我的findStrobogrammatic()得到的数组在本质上是升序排列的
}
return vec.size() - count;
}
count = 0;
for (auto x:vec)
{
double val = 0;
for (int i = 0; i < n1; i++)
{
val = val * 10 + (x.at(i) - '0');
}
if (val >= Low&&val<High) count++;//在我的findStrobogrammatic()得到的数组在本质上是升序排列的
}
ans +=count;
count = 0;
vec.clear();
vec = findStrobogrammatic(n2);
for (auto x : vec)
{
double val = 0;
for (int i = 0; i < n2; i++)
{
val = val * 10 + (x.at(i) - '0');
}
if (val<=High&&val>Low) count++;//记录不比High大的元素个数
}
ans += count;
return ans;
}`

如有更好的意见,还请赐教,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

渊冰语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值