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.
--------------------------------------------------------
class Solution {
public:
    bool isStrobogrammatic(string num) {
        int i = 0, j = num.length() - 1;
        while (i <= j) {
            if ((num[i] == '1' && num[j] == '1') 
                || (num[i] == '8' && num[j] == '8') 
                || (num[i] == '0' && num[j] == '0')
                || (num[i] == '6' && num[j] == '9')
                || (num[i] == '9' && num[j] == '6')){
                i++;
                j--;
            }else {
                return false;
            }
        }
        
        return true;
    }
};
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
Given n = 2, return
["11","69","88","96"].
Hint:
- Try to use recursion and notice that it should recurse with n - 2 instead of n - 1.
也可递归
class Solution {
public:
    vector<string> findStrobogrammatic(int n) {
        vector<string> odd = {"1","8","0"};
        if (n == 1) return odd;
        vector<string> rt;
        if (n % 2 == 1) {
            rt = odd;
        }else {
            rt.push_back("");
        }
        
        int i = 0;
        while (i < n - 1) {
            vector<string> t;
            for (string s : rt) {
                if (i + 2 < n - 1) t.push_back("0" + s + "0");
                t.push_back("1" + s + "1");
                t.push_back("8" + s + "8");
                t.push_back("6" + s + "9");
                t.push_back("9" + s + "6");
            }
            i += 2;
            rt = t;
        }
        
        return rt;
    }
};
另一种方法
class Solution {
public:
    void helper(vector<string> &rt,string s,int left,int right) {
        if (left > right) {
            if (s[0] != 0) {
                rt.push_back(s);
            }
            return;
        }
        if (left != 0) {
            s[left] = '0',s[right] = '0';
            helper(rt,s,left + 1,right - 1);
        }
        s[left] = '1',s[right] = '1';
        helper(rt,s,left + 1,right - 1);
        s[left] = '8',s[right] = '8';
        helper(rt,s,left + 1,right - 1);
        if (left != right) {
            s[left] = '6',s[right] = '9';
            helper(rt,s,left + 1,right - 1);
            s[left] = '9',s[right] = '6';
            helper(rt,s,left + 1,right - 1);
        }
        
    }
    vector<string> findStrobogrammatic(int n) {
        vector<string> rt;
        string s(n,'\0');
        helper(rt,s,0,n - 1);
        if (n == 1) rt.push_back("0");
        return rt;
    }
};
Flatten 2D Vector
Implement an iterator to flatten a 2d vector.
For example,
Given 2d vector =
Given 2d vector =
[ [1,2], [3], [4,5,6] ]
By calling next repeatedly until hasNext returns false, the order of elements returned by next should be: 
[1,2,3,4,5,6].
Hint:
- How many variables do you need to keep track?
- Two variables is all you need. Try with xandy.
- Beware of empty rows. It could be the first few rows.
- To write correct code, think about the invariant to maintain. What is it?
- The invariant is xandymust always point to a valid point in the 2d vector. Should you maintain your invariant ahead of time or right when you need it?
- Not sure? Think about how you would implement hasNext(). Which is more complex?
- Common logic in two different places should be refactored into a common method.
Only with iterators
C++的iterator没有next或hasNext
class Vector2D {
public:
    Vector2D(vector<vector<int>>& vec2d) {
        itr1 = vec2d.begin();
        end1 = vec2d.end();
        if (itr1 != end1) {
            itr2 = itr1->begin();
        }
    }
    int next() {
        hasNext();
        int rt = *itr2;
        itr2++;
        return rt;
    }
    bool hasNext() {
        while (itr1 != end1) {
            if (itr2 != itr1->end()) return true;
            itr1++;
            if (itr1 != end1) {
                itr2 = itr1->begin();
            }
        }
        
        return false;
    }
private:
    vector<vector<int>>::iterator itr1, end1;
    vector<int>::iterator itr2;
};
/**
 * Your Vector2D object will be instantiated and called as such:
 * Vector2D i(vec2d);
 * while (i.hasNext()) cout << i.next();
 */
3Sum Smaller
Given an array of n integers nums and a target, find the number of index triplets 
i, j, k with 0 <= i < j < k < n that satisfy the condition nums[i] + nums[j] + nums[k] < target.
For example, given nums = 
[-2, 0, 1, 3], and target = 2.
Return 2. Because there are two triplets which sums are less than 2:
[-2, 0, 1] [-2, 0, 3]
Follow up:
Could you solve it in O(n2) runtime?
--------------------------------------------------------Could you solve it in O(n2) runtime?
O(n^2), 给的条件 i < j < k一点用也没有
class Solution {
public:
    int threeSumSmaller(vector<int>& nums, int target) {
        int count = 0;
        sort(nums.begin(),nums.end());
        for (int i = 0; i < (int)nums.size() - 2; i++) {
            int left = i + 1, right = nums.size() - 1;
            int sum = target - nums[i];
            
            while (left < right) {
                if (nums[left] + nums[right] >= sum) {
                    right--;
                }else {
                    count += right - left;
                    left++;
                }
            }
        }
        
        return count;
    }
};
 
No comments:
Post a Comment