1. 程式人生 > >【劍指offer{31-34}】整數中1出現的次數(從1到n整數中1出現的次數)、把陣列排成最小的數、醜數、第一個只出現一次的字元

【劍指offer{31-34}】整數中1出現的次數(從1到n整數中1出現的次數)、把陣列排成最小的數、醜數、第一個只出現一次的字元

整數中1出現的次數(從1到n整數中1出現的次數)

題目描述

  • 求出1-13的整數中1出現的次數,並算出100-1300的整數中1出現的次數?為此他特別數了一下1~13中包含1的數字有1、10、11、12、13因此共出現6次,但是對於後面問題他就沒轍了。ACMer希望你們幫幫他,並把問題更加普遍化,可以很快的求出任意非負整數區間中1出現的次數(從1 到 n 中1出現的次數)。

C++程式碼

class Solution {
public:
    int NumberOf1Between1AndN_Solution(int n)
    {
        if(n==0)
        {
            return 0;
        }
        int count = 0;
        for(int i = 1;i<=n;i++)
        {
            count = count + NumOne(i);
        }
        return count;
    }
    int NumOne(int k)
    {
        int res = 0;
        while(k)
        {
            if(k%10==1)
            {
                res++;
            }
            k = k/10;
        }
        return res;
    }
};

把陣列排成最小的數

題目描述

  • 輸入一個正整數陣列,把數組裡所有數字拼接起來排成一個數,列印能拼接出的所有數字中最小的一個。例如輸入陣列{3,32,321},則打印出這三個數字能排成的最小數字為321323。

C++程式碼

class Solution {
public:
    vector<vector<int>>res;
    string PrintMinNumber(vector<int> numbers) 
    {
        sort(numbers.begin(),numbers.end());
        do
        {
            res.push_back(numbers);
        }while(next_permutation(numbers.begin(),numbers.end()));
        vector<string>result;
        for(int i = 0;i<res.size();i++)
        {
            string s = "";
            for(int j = 0;j<res[i].size();j++)
            {
                s = s + to_string(res[i][j]);
            }
            result.push_back(s);
        }
        sort(result.begin(),result.end());
        return result[0];
    }
};

醜數

題目描述

  • 把只包含質因子2、3和5的數稱作醜數(Ugly Number)。例如6、8都是醜數,但14不是,因為它包含質因子7。 習慣上我們把1當做是第一個醜數。求按從小到大的順序的第N個醜數。

C++程式碼

class Solution {
public:
    int GetUglyNumber_Solution(int index) 
    {
        if(index<=0)
        {
            return 0;
        }
        int index0 = 0;
        int index1 = 0;
        int index2 = 0;
        int *ugly = (int*)malloc(sizeof(int)*index);
        ugly[0] = 1;
        int i = 1;
        while(i<index)
        {
            int new2 = ugly[index0]*2;
            int new3 = ugly[index1]*3;
            int new4 = ugly[index2]*5;
            int tempvalue = min(min(new2,new3),new4);
            if(new2==tempvalue)
            {
                index0++;
            }
            if(new3==tempvalue)
            {
                index1++;
            }
            if(new4==tempvalue)
            {
                index2++;
            }
            ugly[i] = tempvalue;
            i++;
        }
        return ugly[index-1];
    }
};

第一個只出現一次的字元

題目描述

  • 在一個字串(0<=字串長度<=10000,全部由字母組成)中找到第一個只出現一次的字元,並返回它的位置, 如果沒有則返回 -1(需要區分大小寫)

C++程式碼

class Solution {
public:
    int FirstNotRepeatingChar(string str) 
    {
        unordered_map<char,int>mp;
        for(int i = 0;i<str.size();i++)
        {
            mp[str[i]]++;
        }
        for(int j = 0;j<str.size();j++)
        {
            if(mp[str[j]]==1)
            {
                return j;
            }
        }
        return -1;
    }
};