LeetCode日记1

第一题

错误思路:

(1)不能直接用双重for循环判断两个数相加等于target,会超时。

正确思路:

(1)用一个结构体记录数字和数字的index。

(2)用qsort对结构体的vector排序。

(3)双重for循环从排序后的vector的两头向中间,判断。

(4)找到后判断两个结构index的大小,先输出小的。

参考:

http://www.acmerblog.com/leetcode-two-sum-5223.html

其他:

(1)快速排序

void qsort(

   void *base,

   size_t num,

   size_t width,

   int (__cdecl *compare )(const void *, const void *) 

);

base

目标数组的开头。

num

元素的数组大小。

width

以字节为单位的元素大小。

compare

给比较两个数组的元素并返回值指定这些关系的一个用户提供的实例的指针。

(2)vs查看函数原型的方法

光标停留在函数上,按F1连接到MSDN。


第二题

(1)用new动态分配对象。

问题:

(1)new的相关知识。


第三题

题目:

Given a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest substring is "b", with the length of 1.

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
    	int repeat, prej = 0;
    	unsigned int length = 0;
    	for (string::size_type i = 0; i < s.size(); i++){
    		for (string::size_type j = prej + 1; j < s.size(); j++){
    			repeat = 0;
    			for (string::size_type k = i; k < j; k++){
    				if (s[k] == s[j]){
    					repeat = 1;
    					prej = j;
    					if ((j - i) > length) length = j - i;
    					i = k;
    					break;
    				}
    			}
    			if (repeat == 0) {
    			    if(j == s.size() - 1)
    			        if ((j - i + 1) > length) length = j - i + 1 ;
    			    continue;
    			}
    			else break;
    		}
    	}
    	if(prej == 0) length = s.size();
    	return length;
    }
};

(1)说明  

i指向所判断子字符串的首元素,j指向所判断子字符串的尾元素,k用于遍历子字符串判断是否出现重复。prej用于记录上一次出现重复的字符的位子,若出现字符重复时,下次循环分别使ij指向两个重复字符的下一个位子。

(2)什么时候计算长度。

1)prej == 0,说明没有进入判断两个字符相同的逻辑;或者字符串的长度为0,没有进入第一重for循环;或者字符串的长度为1,没有进入第二重for循环。此时length = s.size();

2)当判断两个字符相同时。此时长度计算公式是 length = j - i ;

3)当j指向原字符串的尾元素时。此时长度计算公式是 length = j - i + 1 ;

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