目录
13、罗马数字转整数
例如, 罗马数字 2 写做 II
,即为两个并列的 1。12 写做 XII
,即为 X
+ II
。 27 写做 XXVII
, 即为 XX
+ V
+ II
。
通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII
,而是 IV
。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX
。这个特殊的规则只适用于以下六种情况:
I
可以放在V
(5) 和X
(10) 的左边,来表示 4 和 9。X
可以放在L
(50) 和C
(100) 的左边,来表示 40 和 90。C
可以放在D
(500) 和M
(1000) 的左边,来表示 400 和 900。
给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。
class Solution {
public:
int romanToInt(string s) {
map<char, int> hashmap;
hashmap.insert(map<char, int>::value_type('I',1));
hashmap.insert(map<char, int>::value_type('V',5));
hashmap.insert(map<char, int>::value_type('X',10));
hashmap.insert(map<char, int>::value_type('L',50));
hashmap.insert(map<char, int>::value_type('C',100));
hashmap.insert(map<char, int>::value_type('D',500));
hashmap.insert(map<char, int>::value_type('M',1000));
int res = 0;
for(int i=0; i<s.size(); i++) {
if(i<s.size()-1 && hashmap[s[i]]<hashmap[s[i+1]])
res -= hashmap[s[i]];
else
res += hashmap[s[i]];
}
return res;
}
};
242、有效的字母异位词
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
示例 1:
输入: s = "anagram", t = "nagaram" 输出: true
示例 2:
输入: s = "rat", t = "car" 输出: false
class Solution {
public:
bool isAnagram(string s, string t) {
if(s.size()!=t.size()) return false;
unordered_map<char,int> mymap;
for(int i=0; i<s.size();i++)
mymap[s[i]]++;
for(int i=0; i<t.size();i++)
mymap[t[i]]--;
for(int i=0; i<t.size();i++){
if(mymap[t[i]] != 0)
return false;
}
return true;
}
};
217、存在重复元素
给定一个整数数组,判断是否存在重复元素。
如果任何值在数组中出现至少两次,函数返回 true。如果数组中每个元素都不相同,则返回 false。
示例 1:
输入: [1,2,3,1] 输出: true
示例 2:
输入: [1,2,3,4] 输出: false
示例 3:
输入: [1,1,1,3,3,4,3,2,4,2] 输出: true
class Solution {
public:
bool containsDuplicate(vector<int>& nums) {
set<int> myset(nums.begin(), nums.end());
return myset.size() != nums.size();
}
};
122、买卖股票的最佳时机II
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
示例 1:
输入: [7,1,5,3,6,4] 输出: 7 解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。 随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。
示例 2:
输入: [1,2,3,4,5] 输出: 4 解释: 在第 1 天(股票价格 = 1)的时候买入,在第 5 天 (股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。 注意你不能在第 1 天和第 2 天接连购买股票,之后再将它们卖出。 因为这样属于同时参与了多笔交易,你必须在再次购买前出售掉之前的股票。
示例 3:
输入: [7,6,4,3,1] 输出: 0 解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。
class Solution {
public:
int maxProfit(vector<int>& prices) {
if(prices.empty()) return 0;
int res = 0;
for(int i=0; i<prices.size()-1; i++) {
if(prices[i+1] > prices[i])
res += (prices[i+1] - prices[i]);
}
return res;
}
};
171、Excel表列序号
给定一个Excel表格中的列名称,返回其相应的列序号。
例如,
A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 ...
示例 1:
输入: "A" 输出: 1
示例 2:
输入: "AB" 输出: 28
示例 3:
输入: "ZY" 输出: 701
class Solution {
public:
int titleToNumber(string s) {
int res = 0;
for(int i=0; i<s.size(); i++){
int temp = s[i] -'A' + 1;
res = res*26 + temp;
}
return res;
}
};
108、将有序数组转换为二叉搜索树
class Solution {
public:
TreeNode* sortedArrayToBST(vector<int>& nums) {
if(nums.empty()) return NULL;
TreeNode* root = new TreeNode (nums[(nums.size()-1)/2]);
vector<int> left(nums.begin(), nums.begin()+(nums.size()-1)/2);
vector<int> right(nums.begin()+(nums.size()-1)/2+1, nums.end());
root -> left = sortedArrayToBST(left);
root -> right = sortedArrayToBST(right);
return root;
}
};