Leetcode题解(四)
12/13、Integer to Roman/Roman to Integer
题目
罗马数字规则:
符号 | I | V | X | L | C | D | M |
数字 | 1 | 5 | 10 | 50 | 100 | 500 | 1000 |
代码如下:
class Solution { public: string intToRoman(int num) { string str; string symbol[]={"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"}; int value[]= {1000,900,500,400, 100, 90, 50, 40, 10, 9, 5, 4, 1}; for(int i=0;num!=0;++i) { while(num>=value[i]) { num-=value[i]; str+=symbol[i]; } } return str; } };
举一反三,如果是将罗马数字转换为整数呢。思路是一样。参考代码如下:
class Solution { public: int romanToInt(string s) { int ret = toNumber(s[0]); for (int i = 1; i < s.length(); i++) { if (toNumber(s[i - 1]) < toNumber(s[i])) { ret += toNumber(s[i]) - 2 * toNumber(s[i - 1]); } else { ret += toNumber(s[i]); } } return ret; } int toNumber(char ch) { switch (ch) { case 'I': return 1; case 'V': return 5; case 'X': return 10; case 'L': return 50; case 'C': return 100; case 'D': return 500; case 'M': return 1000; } return 0; } };
-------------------------------------------------------------------------------------------------分割线----------------------------------------------------------------------------
14、Longest Common Prefix
题目
这道题目比较简单,参考代码如下:
class Solution { public: string longestCommonPrefix(vector<string> &strs) { int length = strs.size(); string result=""; int index=0,i; char temp; bool flag=true; if(0 == length) return ""; while(flag) { temp=strs[0][index]; for (i=0;i<length;i++) { if (index>=strs[i].length() ||strs[i][index] != temp) { flag=false; break; } } if(i==length) result += temp; index++; } return result; } };
----------------------------------------------------------------------------------------------分割线-------------------------------------------------------------------------------
15、3Sum
题目
这道题目和Leetcode第1题很相似,第1题中是对排序数组进行收尾夹逼求解。因此在这一题中,我们任然也可以采用收尾夹逼的准则去求解。在每次求解的过程中,先固定好一个数c,然后采用夹逼方法判断a+b ?= -c,如果不等且a+b<-c,a右移,相反的,b左移;
题目要求不能有重复的解。为了避免重复解,在每次固定c值时,如果该值之前已经做过判断,直接跳过。
代码如下:
class Solution { public: vector<vector<int> > threeSum(vector<int> &num) { // Start typing your C/C++ solution below // DO NOT write int main() function vector<vector<int> > ret; ret.clear(); sort(num.begin(),num.end()); for(int i=0; i!=num.size();i++){ if(i > 0 && num[i]==num[i-1]) continue; int j,k; j=i+1; k=num.size()-1; while(j<k){ if(j>i+1&&num[j]==num[j-1]){ j++; continue; } if(k<num.size()-1&& num[k]==num[k+1]){ k--; continue; } int sum = num[i] + num[j] + num[k]; if(sum>0){ k--; }else if(sum<0){ j++; }else{ vector<int> tmp; tmp.push_back(num[i]); tmp.push_back(num[j]); tmp.push_back(num[k]); ret.push_back(tmp); j++; } } } return ret; } };
算法的时间复杂度是:排序O(nlogn)和遍历O(n*n).
--------------------------------------------------------------------------------------------分割线---------------------------------------------------------------------------------
16、3Sum Closest
题目
这题和15题是一个意思,都是采用先排序,再首尾夹逼。代码如下:
class Solution { public: int threeSumClosest(vector<int> &num, int target) { // Start typing your C/C++ solution below // DO NOT write int main() function sort(num.begin(), num.end()); int ret; bool first = true; for(int i = 0; i < num.size(); i++) { int j = i + 1; int k = num.size() - 1; while(j < k) { int sum = num[i] + num[j] + num[k]; if (first) { ret = sum; first = false; } else { if (abs(sum - target) < abs(ret - target)) ret = sum; } if (ret == target) return ret; if (sum > target) k--; else j++; } } return ret; } };
- 36.c/c++程序员面试宝典-表
- iOS的推送机制
- 对final关键字的理解
- Java的抽象类和内部类
- 堆的插入、删除和建立操作,堆排序
- 7-1
- The ID3 Algorithm
- VC++ 外壳扩展编程之windows右键菜单
- Light OJ 1116 - Ekka Dokka
- ios学习之个人笔记(超级猜图)
- Linux下搭建SVN服务器
- MyEclipse使用经验归纳
- 5.x控件:FloatingActionButton、SnackBar、DrawerLayout、NavigationView
- Spring4 AOP详解
- UI(二)
- x&(x-1)
- java web简单权限管理设计
- runtime实践之Method Swizzling
- 探索需求--设计前的质量之三
- CYC-多线程之详解