Leetcode题解(四)

12/13、Integer to Roman/Roman to Integer 

题目

罗马数字规则:

符号IVXLCDM
数字1510501005001000

代码如下:

 

 1 class Solution {
 2 public:
 3     string intToRoman(int num) {
 4         string str;    
 5         string symbol[]={"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};    
 6         int value[]=    {1000,900,500,400, 100, 90,  50, 40,  10, 9,   5,  4,   1};   
 7         for(int i=0;num!=0;++i)  
 8         {  
 9             while(num>=value[i])  
10             {  
11                 num-=value[i];  
12                 str+=symbol[i];  
13             }  
14         }  
15         return str;  
16 
17     }
18 };

举一反三,如果是将罗马数字转换为整数呢。思路是一样。参考代码如下:

 1 class Solution {
 2 public:
 3     int romanToInt(string s) {
 4         int ret = toNumber(s[0]);
 5         for (int i = 1; i < s.length(); i++) {
 6             if (toNumber(s[i - 1]) < toNumber(s[i])) {
 7                 ret += toNumber(s[i]) - 2 * toNumber(s[i - 1]);
 8             } else {
 9                 ret += toNumber(s[i]);
10             }
11         }
12         return ret;
13     }
14     
15     int toNumber(char ch) {
16         switch (ch) {
17             case 'I': return 1;
18             case 'V': return 5;
19             case 'X': return 10;
20             case 'L': return 50;
21             case 'C': return 100;
22             case 'D': return 500;
23             case 'M': return 1000;
24         }
25         return 0;
26     }
27 };

 

-------------------------------------------------------------------------------------------------分割线----------------------------------------------------------------------------

14、Longest Common Prefix

题目

这道题目比较简单,参考代码如下:

 1 class Solution {
 2 public:
 3     string longestCommonPrefix(vector<string> &strs) {
 4         int length = strs.size();
 5         string result="";
 6         int index=0,i;
 7         char temp;
 8         bool flag=true;
 9         if(0 == length)
10             return "";
11         while(flag)
12         {
13             temp=strs[0][index];
14 
15             for (i=0;i<length;i++)
16             {
17                 if (index>=strs[i].length() ||strs[i][index] != temp)
18                 {
19                     flag=false;
20                     break;
21                 }
22 
23             }
24             if(i==length)
25                 result += temp;
26             index++;
27 
28         }
29         return result;
30     }
31 };

 

----------------------------------------------------------------------------------------------分割线-------------------------------------------------------------------------------

15、3Sum

题目

这道题目和Leetcode第1题很相似,第1题中是对排序数组进行收尾夹逼求解。因此在这一题中,我们任然也可以采用收尾夹逼的准则去求解。在每次求解的过程中,先固定好一个数c,然后采用夹逼方法判断a+b ?= -c,如果不等且a+b<-c,a右移,相反的,b左移;

题目要求不能有重复的解。为了避免重复解,在每次固定c值时,如果该值之前已经做过判断,直接跳过。

代码如下:

 1 class Solution {
 2 public:
 3     vector<vector<int> > threeSum(vector<int> &num) {
 4         // Start typing your C/C++ solution below
 5         // DO NOT write int main() function
 6        
 7         vector<vector<int> > ret;
 8          ret.clear();
 9         sort(num.begin(),num.end());
10         for(int i=0; i!=num.size();i++){
11             if(i > 0 && num[i]==num[i-1])
12                 continue;
13             int j,k;
14             j=i+1;
15             k=num.size()-1;
16             while(j<k){
17                 if(j>i+1&&num[j]==num[j-1]){ 
18                     j++;
19                     continue;
20                 }
21                 if(k<num.size()-1&& num[k]==num[k+1]){
22                     k--;
23                     continue;
24                 }
25                  int sum = num[i] + num[j] + num[k];
26                 if(sum>0){
27                     k--;
28                 }else if(sum<0){
29                     j++;
30                 }else{
31                     vector<int> tmp;
32                     tmp.push_back(num[i]);
33                     tmp.push_back(num[j]);
34                     tmp.push_back(num[k]);
35                     ret.push_back(tmp);
36                     j++;
37                 }
38             }
39         }
40         return ret;
41             
42     }
43 };

算法的时间复杂度是:排序O(nlogn)和遍历O(n*n).

 

--------------------------------------------------------------------------------------------分割线---------------------------------------------------------------------------------

16、3Sum Closest

题目

 

这题和15题是一个意思,都是采用先排序,再首尾夹逼。代码如下:

 1 class Solution {
 2 public:
 3     int threeSumClosest(vector<int> &num, int target) {
 4         // Start typing your C/C++ solution below
 5         // DO NOT write int main() function
 6         sort(num.begin(), num.end());
 7         
 8         int ret;
 9         bool first = true;
10         
11         for(int i = 0; i < num.size(); i++)
12         {
13             int j = i + 1;
14             int k = num.size() - 1;
15             
16             while(j < k)
17             {
18                 int sum = num[i] + num[j] + num[k];
19                 if (first)
20                 {
21                     ret = sum;
22                     first = false;
23                 }
24                 else
25                 {
26                     if (abs(sum - target) < abs(ret - target))
27                         ret = sum;                                         
28                 }
29                 
30                 if (ret == target)
31                     return ret;
32                 
33                 if (sum > target)
34                     k--;
35                 else
36                     j++;
37             }
38         }
39         
40         return ret;
41     }
42 };

 

转载于:https://www.cnblogs.com/LCCRNblog/p/5011249.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值