[Locked] Strobogrammatic Number & Strobogrammatic Number II & Strobogrammatic Number III

Strobogrammatic Number

A strobogrammatic number is a number that looks the same when rotated 180 degrees (looked at upside down). Write a function to determine if a number is strobogrammatic. The number is represented as a string. 

For example, the numbers "69", "88", and "818" are all strobogrammatic.

分析:

  找出中心对称的阿拉伯数字串,解释型题目,其中0,1,8本身是中心对称的,69互相中心对称

代码:

bool isStrobogrammatic(string num) {
    int i = 0, j = int(num.length()) - 1;
    while(i < j) {
        if((num[i] == '6' && num[j] == '9') || (num[i] == '9' && num[j] == '6') || (num[i] == num[j] && (num[i] == '0' || num[i] == '1' || num[i] == '8'))) {
            i++;
            j--;
        }
        else
            return false;
    }
    //如果i大于j,则为偶数串,直接return true;i等与j,则判断num[i]本身是否是中心对称
    return i > j ? true : (num[i] == '0' || num[i] == '1' || num[i] == '8');
}

Strobogrammatic Number II

A strobogrammatic number is a number that looks the same when rotated 180 degrees (looked at upside down). Find all strobogrammatic numbers that are of length = n. 

For example, given n = 2, return ["11","69","88","96"].

分析:

   跟I类似,主要问题还是在与代码解释,由于要列出所有可能的答案,递归的复杂度是至少的,所以就用递归吧,DFS, BFS都行

代码:

void dfs(vector<string> &result, string str, int i, int j) {
    if(i == -1) {
        result.push_back(str);
        return;
    }
    if(i == j) {
        i--;
        j++;
        dfs(result, str + '0', i, j);
        dfs(result, str + '1', i, j);
        dfs(result, str + '8', i, j);
    }
    else {
        i--;
        j++;
        if(i != -1)
            dfs(result, '0' + str + '0', i, j);
        dfs(result, '1' + str + '1', i, j);
        dfs(result, '8' + str + '8', i, j);
        dfs(result, '6' + str + '9', i, j);
        dfs(result, '9' + str + '6', i, j);
    }
    return;
}
vector<string> findCertainStrobogrammatic(int num) {
    vector<string> result;
    dfs(result, "", (num - 1)/2, num/2);
    return result;
}

Strobogrammatic Number III

The idea is similar to Strobogrammatic Number II: generate all those in-range strobogrammatic numbers and count.

分析:

  与两个边界中任何一个等长的字符串要进行逐个验证满足要求。最初的想法为了减少时间复杂度,长度n(n > 1)介于两者之间的直接用个数函数计算:n为偶数时,count(n) = 4 * 5^(n/2 -1);n为奇数时,count(n) = 12 * 5^(n/2 - 1)。但问题在于,n足够大时,O(n * 5^n)与O(5^n)基本没差别,所以如果采用逐个验证的方法,也就不必在乎小于n时的计算量了。

原文地址:https://www.cnblogs.com/littletail/p/5212527.html