1. Leetcode problems (2019.2.25-2019.3.3)
I.Question 13. Roman to Integer
Solution 1:
#include <iostream>
#include <string>
using namespace std;
int romanCharToInt(char ch){
//利用switch case实现字典的功能,将罗马数字转换为阿拉伯数字
int d = 0;
switch(ch){
case 'I':
d = 1;
break;
case 'V':
d = 5;
break;
case 'X':
d = 10;
break;
case 'L':
d = 50;
break;
case 'C':
d = 100;
break;
case 'D':
d = 500;
break;
case 'M':
d = 1000;
break;
}
return d;
}
int romanToInt(string s){
//string数据类型如何定义,有哪些操作需要学习
if(s.size() <= 0) return 0;//特殊情况,如果字符串没有,则转换值为0
int result = romanCharToInt(s[0]);
for(int i = 1; i < s.size(); i++){
//考虑字符串前后关系,如果前小后大有可能需要减,前大后小,正常累加
int curr = romanCharToInt(s[i]);
int prev = romanCharToInt(s[i-1]);
if(prev < curr)
result = result - prev + curr - prev;
else
result = result + curr;
}
return result;
}
int main(int argc, char**argv){
string s("MCMXCIV");
//了解main()中两个参数作用
if(argc > 1){
s = argv[1];}
cout << s << ":" << romanToInt(s) << endl;
return 0;
};
时间复杂度 O(N),空间复杂度O(1)
argc, argv 用命令行编译程序时有用
argc:整数,用来统计运行程序时送给main函数的命令行参数的个数;
**argv:指针数组,存放指向字符串参数的指针,每一个元素指向一个参数
argv[0]指向程序运行的全路径名
argv[1]在DOS命令中执行程序名后第一个字符串
II.Question 9. Palindrome Number
Solution 1:
class Solution {
public:
bool isPalindrome(int x) {
if(x < 0) return false;//x是负数时,先否决不是回文数
if((x != 0) && x % 10 == 0) return false;//x是末尾有零的也先否决
int ver = 0;
//回文数,只需要拿后半段和前半段进行比对,无需x和x反进行比对,避免溢出错误
while ( ver < x ){
ver = 10 * ver + x % 10;
x = x / 10;//integer利用/10的方法,一位一位取出数字
}
//回文数用前半段和后半段,可能出现正好平分,可能出现多一位现象
if((ver == x) || (ver == x * 10 + ver % 10))
return true;
else
return false;
}
};
时间复杂度 O(N),空间复杂度 O(1)
III.Question 7:reverse integer
Solution 1:
#define INT_MAX 2147473647
#define INT_MIN (-INT_MAX-1)
class Solution{
public:
int reverse(int x){
int rev =0;
while(x != 0){
int pop = x % 10;
if((rev > INT_MAX/10) || (rev < INT_MIN/10))
return 0;
else
rev = rev * 10 + pop;
}
return rev;
}
};
- 通过pop出x的最后一位,然后把这一位push进rev,最后rev就是x的逆序
- 这个方法非常危险,因为在rev = rev * 10 + pop处容易溢出,所以需要额外的条件判断
- 时间复杂度O(log(x)),空间复杂度O(1)
IV Question 1: two sum
Solution:
class Solution{
public:
int[] twosum(int[] nums, int target){
Map<integer, integer> map = new Hashmap<>();
for(int i = 0; i < nums.length; i++){
int complement = target - nums[i];
if (map.containsKey(complement)){
return new int[] {map.get(componet), i};
}
map.put(nums.put[i],i);
}
throw new IllegalArgumentException("No tow solution");
}
};
- C++里的new()方法
- 数组和字符串,长度,length和size()
- map定义,生成,填空,查找使用
困惑点:
1.溢出问题
2.int main(int argc, char *argv[])的参数
3.c++如何实现python中的字典结构
4. C++里的new()方法
5.数组和字符串,长度,length和size()
6.map定义,生成,填空,查找使用