lintcode-微軟筆試

來源:互聯網
上載者:User
646. 第一個獨特字元位置 題目: 給出一個字串。找到字串中第一個不重複的字元然後返回它的下標。如果不存在這樣的字元,返回 -1。 範例:

給出字串 s = "lintcode",返回 0。
給出字串 s = "lovelintcode",返回 2。

思路:簡單的hash應用。遍曆一次,紀錄每個字元出現的次數,再遍曆一次,次數大於1的字元就是答案。 題目連結:http://www.lintcode.com/zh-cn/problem/first-position-unique-character/ 代碼:

class Solution {public:    /*     * @param s: a string     * @return: it's index     */    int firstUniqChar(string &s) {        // write your code here        int len = s.length();map <char,int> mp;        for(int i = 0;i < len; i ++){        mp[s[i]] ++;         }        for(int i = 0;i < len ; i ++){        if(mp[s[i]] == 1)        return i;        }        return -1;    }};

702. 串連兩個字串中的不同字元 
題目: 給出兩個字串, 你需要修改第一個字串,將所有與第二個字串中相同的字元刪除, 並且第二個字串中不同的字元與第一個字串的不同字元串連。
範例

給出 s1 = aacdb, s2 = gafd
返回 cbgf
給出 s1 = abcs, s2 = cxzca;
返回 bsxz 思路: 遍曆字串s1,把每個出現過的字元標記為1,然後遍曆字串s2中每個字元,如果字元在s1中出現過,標記為-1,其他字元標記為1。最後把標記為1的字元組合成新字串,即為答案。
題目連結:http://www.lintcode.com/zh-cn/problem/concatenated-string-with-uncommon-characters-of-two-strings/
代碼:

class Solution {public:    /*     * @param : the 1st string     * @param : the 2nd string     * @return: uncommon characters of given strings     */    string concatenetedString(string &s1, string &s2) {        // write your code here    map <char,int> mp;    string ans = "";    int len1 = s1.length();    int len2 = s2.length();    if(len2 == 0)    return s1;    for(int i = 0;i < len1; i ++){    if(mp[s1[i]] != 1)    mp[s1[i]] ++;    }    for(int i = 0;i < len2 ;i ++){    if(mp[s2[i]] == 1)    mp[s2[i]] = -1;    }    for(int i = 0;i < len2 ;i ++){    if(mp[s2[i]] == -1)    continue;    if(mp[s2[i]] != 1)    mp[s2[i]] ++;    }    for(int i = 0;i < len1; i ++){    if(mp[s1[i]] == 1){    ans = ans + s1[i];    }    }    for(int i = 0;i < len2 ;i ++){    if(mp[s2[i]] == 1){    ans = ans + s2[i];    }    }    return ans;    }};

728. 3個不同的因子
題目: 給一 正整數 n (1 <= n <= 10^18). 判斷這個數是否正好只有 3 個不同的因子, 如果正好有 3 個不同的因子就返回 true, 否則返回 false
範例

給出 n = 9, 返回 true 數字 9 正好有 3 個因子: 1, 3, 9, 所以返回 true.
給出 n = 10, 返回 false 思路: 數字 n 只有三個因子,說明除了1和 n 本身,只能有一個因子 x ,且 x 是這個數位開方。x 除了1和本身不能再有別的因子,因此 x 是質數。首先遍曆比1大比 x 小的整數,如果這個整數能整除 n ,即是 n 的因子,返回false。如果找到 x ,判斷 x 是否是質數,如果是,返回true ,否則返回false。
題目連結:http://www.lintcode.com/zh-cn/problem/three-distinct-factors/
代碼:

class Solution {public:    /*     * @param : the given number     * @return:  return true if it has exactly three distinct factors, otherwise false     */    bool isThreeDisctFactors(long long n) {        // write your code here        if(n < 4)        return false;        if(n == 4)        return true;        for(long long i = 3;i * i <= n ;i += 2){        if(n % i == 0 && i * i < n){        return false;        }        if(i * i == n){        for(long long j = 2;j*j <= i;j ++){        if(i % j == 0)        return false;        }        return true;    }        }        return false;    }};


534. 打劫房屋 II 題目:

在上次打劫完一條街道之後,竊賊又發現了一個新的可以打劫的地方,但這次所有的房子圍成了一個圈,這就意味著第一間房子和最後一間房子是挨著的。每個房子都存放著特定金額的錢。你面臨的唯一約束條件是:相鄰的房子裝著相互聯絡的防盜系統,且 當相鄰的兩個房子同一天被打劫時,該系統會自動警示。

給定一個非負整數列表,表示每個房子中存放的錢, 算一算,如果今晚去打劫,你最多可以得到多少錢 在不觸動警示裝置的情況下。

範例

給出nums = [3,6,4], 返回 6, 你不能打劫3和4所在的房間,因為它們圍成一個圈,是相鄰的。

思路: 動態規劃。dp[ i ]表示前 i 個房子能打劫到的最多錢數。動態轉移方程:dp1[i] = max(dp1[i-2] + nums[i],dp1[i-1]);(取前一個打劫 和 前一個不打劫的最大錢數)。因為這裡是環形,首尾只能打劫一次,設兩個狀態轉移方程,一個是打劫過第一間房屋的,一個是不打劫第一間房屋的,最後取最大值。 
題目連結:http://www.lintcode.com/zh-cn/problem/house-robber-ii/
代碼:

class Solution {public:    /*     * @param nums: An array of non-negative integers.     * @return: The maximum amount of money you can rob tonight     */    int houseRobber2(vector<int> nums) {        // write your code here        int len = nums.size();        int dp1[len + 2];        int dp2[len + 2];        if(len == 0)        return 0;        if(len == 1)        return nums[0];        dp1[0] = nums[0];        dp1[1] = max(nums[0],nums[1]);        dp2[0] = 0;        dp2[1] = nums[1];        int ans = dp1[1];        for(int i = 2; i < len;i ++){        dp1[i] = max(dp1[i-2] + nums[i],dp1[i-1]);        dp2[i] = max(dp2[i-2] + nums[i],dp2[i-1]);        // printf("%d %d\n",dp1[i],dp2[i] );        if(i == len - 1){       ans = max(ans,dp1[i-1]);       ans = max(ans,dp2[i]);       }        }        return ans;    }};




聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.