1.题目:给定一个数组,返回数组中的两个数,使两数和为一个给定值(假设只有一种结果)
例:
given nums=[2,7,11,15] , target = 9
Because nums[0]+nums[1]=9,
return [0,1]
方法:两数相加可以有三种情况,大于小于或等于target,所以可以对数组进行排序sort,之后用最左边的数加上最右边的数,结果偏大则取倒数第二位替换最右的数,偏小则取第二位替换最左的数,直到得到相等的数。
代码:
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
vector<int> indices;
int lenOfVectors = nums.size();
bool found=false;
vector< pair<int, int> > new_nums;
for(int i=0; i<lenOfVectors; ++i){
new_nums.push_back(make_pair(nums[i], i));
}//记录每个数在数组中的位置
sort(new_nums.begin(), new_nums.end());
int j=0, k=lenOfVectors-1;
while(j<k){
if(new_nums[j].first+new_nums[k].first==target){
indices.push_back(new_nums[j].second);
indices.push_back(new_nums[k].second);
break;
}
else if(new_nums[j].first+new_nums[k].first<target){
j++;
}
else{
k--;
}
}
return indices;
}
};
2.题目:将连个用链表表示的数相加,数的每一位分别用链表的节点表示,其中个位是头节点,其后的节点分别表示十位千位以及以上,结果同样用链表来表示。
例:
input:(2 -> 4 -> 3)+(5 -> 6 ->4)
Output:7 ->0 ->8
Explanation:342+465=807
方法:
没什么可讲的,主要注意进位,如果最后产生进位,需要再生成一个节点。
代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode* head = new ListNode(0);
ListNode* curr = head;
int cbit = 0;//进位
int a = 0;
int b = 0;
while(l1||l2)
{
int sum = ((l1)?(l1->val):(0)) + ((l2)?(l2->val):(0)) + cbit;
curr->next = new ListNode(sum%10);
cbit = sum/10;
if(l1) l1 = l1->next;
if(l2) l2 = l2->next;
curr = curr->next;
}
if (cbit)
{
curr->next = new ListNode(cbit);
}
return head->next;
}
};
3.题目:给定一个string找出最长的不带重复的string,返回他的长度
例:
input:“abcabcbb”
output:3
Explanation:“abc”
input:“pwwkew”
output:3
Explanation:“wke”
方法:用一个数组表示每种类型的字符在字符串中出现的最后的位置,所求子串长度等于该字符最新出现的位置减去之前最后出现的位置,然后新的位置成为最后出现的位置。
class Solution
{
public:
int lengthOfLongestSubstring(string s)
{
int flags[256];
for (int i = 0; i < 256; i++)
flags[i] = -1;
int longest = 0;
int i = 0;
int collision = -1;
while (s[i] != 0)
{
if (flags[s[i]] != -1)
collision = (collision > flags[s[i]] ? collision : flags[s[i]]);
flags[s[i]] = i;
longest = (i - collision > longest ? i - collision : longest);
i++;
}
return longest;
}
};