• [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时的计算量了。

  • 相关阅读:
    9月23日JavaScript作业----用DIV做下拉列表
    9月23日JavaScript作业----日期时间选择
    9月23日JavaScript作业----两个列表之间移动数据
    9月22日下午JavaScript----Document对象
    9月22日上午JavaScript----window对象
    9月20日下午JavaScript函数--递归
    9月20日上午JavaScript函数
    9月19日下午JavaScript数组冒泡排列和二分法
    9月19日上午JavaScript数组
    9月6日表格标签(table、行、列、表头)(补)
  • 原文地址:https://www.cnblogs.com/littletail/p/5212527.html
Copyright © 2020-2023  润新知