LeetCode日记2

LeetCode-5

思路:

(1)最后用子字符串操作返回string。

    return s.substr(startpos, maxlength);

(2)回文串的判断:

1)首先找出回文串中间连续的重复的字符。

2)再向两边进行判断

(3)优化:

1)若i的位置使后面可能的回文串的最大长度不可能超出maxlength,则直接退出循环。

2)i = k + 1;//此句可防止在同一个回文串中进行多次判断。

参考:

https://leetcode.com/discuss/32204/simple-c-solution-8ms-13-lines


LeetCode-6

(1)string的操作。


LeetCode-7

(1)

to_string函数将int转换为string

reverse函数对string反转

stoll函数将string转换为long long

(2)判断溢出,溢出时返回0

if (tmp > INT_MAX || tmp < INT_MIN) return 0;


LeetCode-8 把string转换为int型,需要考虑string的所有可能

先得到一个string,再转换为__int64x,再转换为int。

(1)去掉前缀空格。

(2)读取符号位。

(3)去掉前缀0。

(4)读取数字,处理溢出的情况。 

DISCUSS中简短的代码学习:

int atoi(const char *str) {
	int sign = 1, base = 0, i = 0;
	while (str[i] == ' ') { i++; }
	if (str[i] == '-' || str[i] == '+') {
		sign = 1 - 2 * (str[i++] == '-');
	}
	while (str[i] >= '0' && str[i] <= '9') {
		if (base >  INT_MAX / 10 || (base == INT_MAX / 10 && str[i] - '0' > 7)) {
			if (sign == 1) return INT_MAX;
			else return INT_MIN;
		}
		base = 10 * base + (str[i++] - '0');
	}
	return base * sign;
}

 (1)while去掉空格;if读取符号;while读取数字(不用去0,因为通过计算得到最后的整数);判断溢出。


(2015/10/21)

LeetCode-9 Palindrome Number :速度需要改进


LeetCode-13 Roman to Integer:从高位开始,把一个字符和它后一个字符比较,若大于等于则加上其代表的数字,若小于则减,最后一个字符直接加上。


(2015/10/22)

LeetCode-11 Container With Most Water:

画一个矩阵,行表示左边的垂线,列表示右边的垂线。

矩阵的对角线,以及左下三角不用计算。(对角线上体积为0,左下三角与右上三角对称)

1)当左垂线的高小于右垂线时,剩下的行不用计算。

2)当有垂线的高小于左垂线时,剩下的列不用计算。

参考:

https://leetcode.com/discuss/11482/yet-another-way-to-see-what-happens-in-the-o-n-algorithm


(2015/10/23)

LeetCode-12 Integer to Roman:

罗马数字与整数的对应关系:

M            D             C             L             X             V             I

1000        500        100          50          10            5            1

从大往小,把整数表示成罗马数字。每次分两种情况:

1)插入n个相同的字母。

2)把小的数字放大的数字左边表示减法。


LeetCode-14 Longest Common Prefix:(easy)找出vector<string> strs中string的公共最长前缀。


LeetCode-15 3Sum:(cant)

参考:

https://leetcode.com/discuss/23595/share-my-solution-around-50ms-with-explanation-and-comments

1)确定第一个数。(忽略重复的情况)

2)剩下两个数的确定,相当于LeetCode-1 TwoSum的情况。(忽略重复的情况)

(先确定起点(front)和终点(rear),下标是否越界通过判断front < rear即可)


(2015/10/24)

LeetCode-16 3Sum Closest:(cant)

要学会举一反三,其实和LeetCode-15是一样的,不同之处只是下标移动的条件不同。

参考:

https://leetcode.com/discuss/42432/c-solution-o-n-2-using-sort


LeetCode-17 Letter Combinations of a Phone Number:(easy)

1)建立一个map数组,表示键盘上每一个数字对应的可能的字母。

2)建立两个数组,一个表示 digits字符串中字符所对应的数字,这个数字在 map中的下标;另一个数组表示对每一个map中的string遍历的下标。

3)可以通过计算一共有多少种可能的string来控制循环的次数。

class Solution {
public:
    vector<string> letterCombinations(string digits) {
        vector<string> map = \
        {"abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
        vector<int> index, scan;
        vector<string> ans;
        
        if(digits.size() == 0) return ans;
        for(string::size_type i = 0; i < digits.size(); i++){
            int tmp = digits[i] - '0';
            if(tmp >= 2 && tmp <= 9){
                index.push_back(tmp - 2);
                scan.push_back(0);
            }
            else return ans;
        }
        
        int nums = 1;
        for(vector<int>::size_type i = 0; i < index.size(); i++)
            nums *= map[index[i]].size();

        for(int i = 0; i < nums; i++){
            string tmp;
            for(vector<int>::size_type i = 0; i < index.size(); i++)
                tmp += map[index[i]][scan[i]];
            ans.push_back(tmp);
            scan[scan.size() - 1]++;
            for(vector<int>::size_type i = index.size() - 1; i > 0; i--){
                if(scan[i] >= map[index[i]].size()) {
                    scan[i] = 0;
                    scan[i - 1]++;
                }
                else break;
            }
        }
        return ans;
    }
};

(2015/10/27)

LeetCode-17 4Sum:(cant)

用到的C++知识:

1)unordered_map:用哈希函数组织的无序、关键字不可重复的map。c.count(k),返回关键字等于k的元素数量。

2)pair类型、make_pair操作

3)vector容器的back操作,返回尾元素的引用。

C++中一个易错的地方,不好的编程习惯?

1)for(vector<int>::size_type i = 0; i < nums.size(); i++),中间的条件判断语句最好不要写i < nums.size() - (一个数)。可能会溢出。

算法参考:https://leetcode.com/discuss/12358/my-c-solution-using-hashtable

1)根据nums的大小判断是否直接返回。

2)排序。

3)建立哈希表,关键字是两个数的和。

4)寻找另外两个数,(跳过重复的数),(得到一个answer时判断是否等于上一个answer(通过容器的back操作)(产生重复的原因:两组下标不同,但值完全相同的两组数,会产生相同的关键字))。


LeetCode-19 Remove Nth Node From End of List:(easy)

1)计算节点总数,算出要删除的是第几个节点。

2)分情况:1)删除的是头结点。2)删除的是中间的节点、尾节点。


LeetCode-20 Valid Parentheses:(easy)堆栈stack。

LeetCode-21 Merge Two Sorted Lists : (easy)


正确的链表构造方式:分别用两个指针指向下面两个需要比较的节点,用一个指针指向新链表的最后一个节点。


LeetCode-26 Remove Duplicates from Sorted Array:(easy)

两个下标:一个表示当前的最后一个非重复元素的下标,另一个扫描容器(扫描时跳过重复的元素)。


(2015/10/28)

LeetCode-27 Remove Element:(easy)

LeetCode-28 Implement strStr():(easy)

注意:

1)要充分考虑到什么时候是不可能(或已不可能)找到needle。

2)正确找到needle的判断条件。

你可能感兴趣的:(LeetCode日记2)