题解:
看代码的注释。
代码:
class Solution {
public:
int rotatedDigits(int N) {
int cnt = 0;
for(int i = 1; i <= N; i++)
{
if(rotateIsOk(i))// 判断: 1.每个数位旋转180°后,是否有效 2. != i
{
cnt++;
}
}
return cnt;
}
bool rotateIsOk(int x)
{
vector <int> vec;
int tx = x;
while(tx)
{
int tmp = tx % 10;
tx /= 10;
// 旋转规则:
// 0 1 8 -> 0 1 8
// 2 5 -> 5 2
// 6 9 -> 9 6
if(tmp == 0 || tmp == 1 || tmp == 8)
{
vec.push_back(tmp);
}
else if(tmp == 2)
{
vec.push_back(5);
}
else if(tmp == 5)
{
vec.push_back(2);
}
else if(tmp == 6)
{
vec.push_back(9);
}
else if(tmp == 9)
{
vec.push_back(6);
}
else
{
//cout << "出现了无效的数" << " " << tmp << endl;
return false;// 1. 如果某个数字不是上述的情况之一,那么旋转后就是无效的数,直接返回false
}
}
//2. 虽然不是无效的数了,但是还要判断旋转之后的数是不是等于原来的数
int rotateNum = 0;
int k = 1;
for(int i = 0; i < (int)vec.size(); i++)
{
rotateNum += vec[i]*k;
k *= 10;
}
if(rotateNum == x)
{
//cout << "rotateNum = x = " << rotateNum << endl;
return false;
}
else
{
//cout << "rotateNum = " << rotateNum << endl;
//cout << "x = " << x << endl;
return true;
}
}
};