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; }};