https://leetcode.com/problems/first-unique-character-in-a-string/description/
Given a string, find the first non-repeating character in it and return it’s index. If it doesn’t exist, return -1.
Examples:
s = "leetcode"
return 0.
s = "loveleetcode",
return 2.
Note: You may assume the string contain only lowercase letters.
#include <iostream>
#include <string>
using namespace std;
class Solution {
public:
    int firstUniqChar(string s) {
        int aiANSI[128] = { 0 };
        for (char c : s)
        {
            aiANSI[c]++;
        }
        for (int i = 0; i < s.size(); i++)
        {
            if (aiANSI[s[i]] == 1)
            {
                return i;
            }
        }
        return -1;
    }
};
int main()
{
    Solution o;
    cout << o.firstUniqChar("loveleetcode") << endl;
    return 0;
}
https://leetcode.com/problems/ransom-note/description/
Given an arbitrary ransom note string and another string containing letters from all the magazines, write a function that will return true if the ransom note can be constructed from the magazines ; otherwise, it will return false.
Each letter in the magazine string can only be used once in your ransom note.
Note:
You may assume that both strings contain only lowercase letters.
canConstruct("a", "b") -> false
canConstruct("aa", "ab") -> false
canConstruct("aa", "aab") -> true
#include <iostream>
#include <string>
using namespace std;
class Solution {
public:
    bool canConstruct(string ransomNote, string magazine) {
        int aiANSI[128] = { 0 };
        for (char c : magazine)
        {
            aiANSI[c]++;
        }
        for (char c : ransomNote)
        {
            if (aiANSI[c] <= 0)
            {
                return false;
            }
            else
            {
                aiANSI[c]--;
            }
        }
        return true;
    }
};
int main()
{
    Solution o;
    cout << o.canConstruct("a", "b") << endl;
    cout << o.canConstruct("aa", "aab") << endl;
    return 0;
}
https://leetcode.com/problems/intersection-of-two-arrays-ii/description/
Given two arrays, write a function to compute their intersection.
Example:
Given nums1 = [1, 2, 2, 1], nums2 = [2, 2], return [2, 2].
Note:
Follow up:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Solution {
public:
    vector<int> intersect(vector<int>& nums1, vector<int>& nums2) {
        vector<int> result;
        sort(nums1.begin(), nums1.end());
        sort(nums2.begin(), nums2.end());
        int i = 0;
        int j = 0;
        while (i < nums1.size() && j < nums2.size())
        {
            if (nums1[i] == nums2[j])
            {
                result.push_back(nums1[i]);
                i++;
                j++;
            }
            else if (nums1[i] < nums2[j])
            {
                i++;
            }
            else
            {
                j++;
            }
        }
        return result;
    }
};
int main()
{
    return 0;
}
https://leetcode.com/problems/binary-watch/description/
A binary watch has 4 LEDs on the top which represent the hours (0-11), and the 6 LEDs on the bottom represent the minutes (0-59).
Each LED represents a zero or one, with the least significant bit on the right.

For example, the above binary watch reads “3:25”.
Given a non-negative integer n which represents the number of LEDs that are currently on, return all possible times the watch could represent.
Example:
Input: n = 1
Return: ["1:00", "2:00", "4:00", "8:00", "0:01", "0:02", "0:04", "0:08", "0:16", "0:32"]
Note:
#include <iostream>
#include <string>
using namespace std;
void func(const string & strSource, const int iMaxNum, const int iSelectNum,
    int iCurIndex, int iCurLeftNum, string & strCurResult)
{
    if (iCurLeftNum == 0)
    {
        cout << strCurResult << endl;
        return;
    }
    for (int i = iCurIndex; i + iCurLeftNum <= iMaxNum; i++)
    {
        strCurResult.push_back(strSource[i]);
        func(strSource, iMaxNum, iSelectNum, i + 1, iCurLeftNum - 1, strCurResult);
        strCurResult.pop_back();
    }
}
int main()
{
    string strResult;
    func("abcdef", 6, 2, 0, 2, strResult);
    return 0;
}
#include <iostream>
#include <string>
#include <vector>
#include <math.h>
using namespace std;
class Solution {
public:
    Solution()
        : hour(4, vector<string>()),
        minute(6, vector<string>())
    {
        int i;
        for (i = 0; i < 4; i++)
        {
            int iCurResult = 0;
            func(4, 0, i, iCurResult, hour[i]);
        }
        for (i = 0; i < 6; i++)
        {
            int iCurResult = 0;
            func(6, 0, i, iCurResult, minute[i]);
        }
        vPrint();
    }
    void vPrint()
    {
        for (int i = 0; i < 4; i++)
        {
            vector<string>::iterator iter = hour[i].begin();
            while (iter != hour[i].end())
            {
                cout << *iter << " ";
                ++iter;
            }
            cout << endl;
        }
        cout << endl;
        for (int i = 0; i < 6; i++)
        {
            vector<string>::iterator iter = minute[i].begin();
            while (iter != minute[i].end())
            {
                cout << *iter << " ";
                ++iter;
            }
            cout << endl;
        }
    }
    vector<string> readBinaryWatch(int num)
    {
    }
private:
    void func(const int iMaxNum, int iCurIndex, int iCurLeftNum, int iCurResult, vector<string> & vecResult)
    {
        if (iCurLeftNum == 0)
        {
            char acResult[10] = { 0 };
            sprintf(acResult, "%d", iCurResult);
            vecResult.push_back(acResult);
            return;
        }
        for (int i = iCurIndex; i + iCurLeftNum <= iMaxNum; i++)
        {
            iCurResult += pow(2, i);
            func(iMaxNum, i + 1, iCurLeftNum - 1, iCurResult, vecResult);
            iCurResult -= pow(2, i);
        }
    }
    vector<vector<string>> hour;
    vector<vector<string>> minute;
};
int main()
{
    Solution o;
    return 0;
}
#include <iostream>
#include <string>
#include <vector>
#include <math.h>
using namespace std;
class Solution {
public:
    Solution()
        : hour(4, vector<string>()),
        minute(6, vector<string>())
    {
        int i;
        for (i = 0; i < 4; i++)
        {
            int iCurResult = 0;
            func(4, 0, i, iCurResult, hour[i], 12, false);
        }
        for (i = 0; i < 6; i++)
        {
            int iCurResult = 0;
            func(6, 0, i, iCurResult, minute[i], 60, true);
        }
        vPrint();
    }
    void vPrint()
    {
        for (int i = 0; i < 4; i++)
        {
            vector<string>::iterator iter = hour[i].begin();
            while (iter != hour[i].end())
            {
                cout << *iter << " ";
                ++iter;
            }
            cout << endl;
        }
        cout << endl;
        for (int i = 0; i < 6; i++)
        {
            vector<string>::iterator iter = minute[i].begin();
            while (iter != minute[i].end())
            {
                cout << *iter << " ";
                ++iter;
            }
            cout << endl;
        }
        cout << endl;
    }
    vector<string> readBinaryWatch(int num)
    {
        vector<string> vecResult;
        for (int i = 0; i <= num; i++)
        {
            if (i <= 3)
            {
                int j = num - i;
                if (0 <= j && j <= 5)
                {
                    vector<string>::iterator iterHour = hour[i].begin();
                    while (iterHour != hour[i].end())
                    {
                        vector<string>::iterator iterMinute = minute[j].begin();
                        while (iterMinute != minute[j].end())
                        {
                            vecResult.push_back(*iterHour + ":" + *iterMinute);
                            ++iterMinute;
                        }
                        ++iterHour;
                    }
                }
            }
        }
        return vecResult;
    }
private:
    void func(const int iMaxNum, int iCurIndex, int iCurLeftNum, int iCurResult, vector<string> & vecResult, const int iMaxValue, bool bFormatZero)
    {
        if (iMaxValue <= iCurResult)
        {
            return;
        }
        if (iCurLeftNum == 0)
        {
            char acResult[10] = { 0 };
            sprintf(acResult, bFormatZero ? "%02d" : "%d", iCurResult);
            vecResult.push_back(acResult);
            return;
        }
        for (int i = iCurIndex; i + iCurLeftNum <= iMaxNum; i++)
        {
            iCurResult += pow(2, i);
            func(iMaxNum, i + 1, iCurLeftNum - 1, iCurResult, vecResult, iMaxValue, bFormatZero);
            iCurResult -= pow(2, i);
        }
    }
    vector<vector<string>> hour;
    vector<vector<string>> minute;
};
int main()
{
    Solution o;
    vector<string> vecResult = o.readBinaryWatch(2);
    vector<string>::iterator iter = vecResult.begin();
    while (iter != vecResult.end())
    {
        cout << *iter << endl;
        ++iter;
    }
    return 0;
}
https://leetcode.com/problems/add-strings/description/
Given two non-negative integers num1 and num2 represented as string, return the sum of num1 and num2.
Note:
num1 and num2 is < 5100.num1 and num2 contains only digits 0-9.num1 and num2 does not contain any leading zero.#include <iostream>
#include <string>
using namespace std;
class Solution {
public:
    string addStrings(string num1, string num2) {
        string strResult;
        int iFlag = 0;
        int iIdx1 = num1.size() - 1;
        int iIdx2 = num2.size() - 1;
        while (iIdx1 >= 0 && iIdx2 >= 0)
        {
            int iSum = (num1[iIdx1] - '0') + (num2[iIdx2] - '0') + iFlag;
            if (iSum >= 10)
            {
                iFlag = 1;
                iSum -= 10;
            }
            else
            {
                iFlag = 0;
            }
            strResult.append(1, iSum + '0');
            iIdx1--;
            iIdx2--;
        }
        while (iIdx1 >= 0)
        {
            int iSum = (num1[iIdx1] - '0') + iFlag;
            if (iSum >= 10)
            {
                iFlag = 1;
                iSum -= 10;
            }
            else
            {
                iFlag = 0;
            }
            strResult.append(1, iSum + '0');
            iIdx1--;
        }
        while (iIdx2 >= 0)
        {
            int iSum = (num2[iIdx2] - '0') + iFlag;
            if (iSum >= 10)
            {
                iFlag = 1;
                iSum -= 10;
            }
            else
            {
                iFlag = 0;
            }
            strResult.append(1, iSum + '0');
            iIdx2--;
        }
        if (iFlag > 0)
        {
            strResult.append(1, '1');
        }
        int i = 0;
        int j = strResult.size() - 1;
        while (i < j)
        {
            int temp = strResult[i];
            strResult[i] = strResult[j];
            strResult[j] = temp;
            i++;
            j--;
        }
        return strResult;
    }
};
int main()
{
    string num1 = "1";
    string num2 = "9";
    Solution o;
    string strResult = o.addStrings(num1, num2);
    cout << strResult << endl;
    return 0;
}
https://leetcode.com/problems/third-maximum-number/description/
Given a non-empty array of integers, return the third maximum number in this array. If it does not exist, return the maximum number. The time complexity must be in O(n).
Example 1:
Input: [3, 2, 1]
Output: 1
Explanation: The third maximum is 1.
Example 2:
Input: [1, 2]
Output: 2
Explanation: The third maximum does not exist, so the maximum (2) is returned instead.
Example 3:
Input: [2, 2, 3, 1]
Output: 1
Explanation: Note that the third maximum here means the third maximum distinct number.
Both numbers with value 2 are both considered as second maximum.
set 遍历的时候,会从小到大。
#include <iostream>
#include <string>
#include <vector>
#include <set>
using namespace std;
class Solution {
public:
    int thirdMax(vector<int>& nums) {
        set<int> setThirdMax;
        vector<int>::iterator iter = nums.begin();
        while (iter != nums.end())
        {
            setThirdMax.insert(*iter);
            if (setThirdMax.size() > 3)
            {
                setThirdMax.erase(setThirdMax.begin());
            }
            ++iter;
        }
        return setThirdMax.size() == 3 ? *setThirdMax.begin() : *setThirdMax.rbegin();
    }
};
int main()
{
    vector<int> nums;
    nums.push_back(1);
    nums.push_back(2);
    nums.push_back(3);
    nums.push_back(4);
    Solution o;
    int iResult = o.thirdMax(nums);
    cout << iResult << endl;
    return 0;
}