01

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定义,生成,填空,查找使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值