【劍指offer{31-34}】整數中1出現的次數(從1到n整數中1出現的次數)、把陣列排成最小的數、醜數、第一個只出現一次的字元
阿新 • • 發佈:2018-12-22
整數中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;
}
};