题一: 实现 strStr()
实现 strStr() 函数。
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。
说明:
当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。
对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与 C 语言的 strstr() 以及 Java 的 indexOf() 定义相符。
示例 1:
输入:haystack = “hello”, needle = “ll”
输出:2
示例 2:
输入:haystack = “aaaaa”, needle = “bba”
输出:-1
示例 3:
输入:haystack = “”, needle = “”
输出:0
提示:
0 <= haystack.length, needle.length <= 5 * 104
haystack 和 needle 仅由小写英文字符组成
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/implement-strstr
思路:先确定两字符串第一个字符相等的位置,并标记下来,再依次比较后续字符是否完全匹配,若匹配就返回标记位置;若不匹配则移向主串标记的下一个位置进行比较。
class Solution {
public:
//这是暴力解法,也可以利用KMP算法
int strStr(string haystack, string needle) {
if(needle.length()==0)
return 0;
int index=-1;//用于标记字符串匹配的初始位置
int i=0;
int j=0;
int count=0;
while(i<haystack.length()){
if(haystack[i]!=needle[j]){
i++;
}
if(haystack[i]==needle[j]){
index=i;
count++;
i++;
j++;
while(j<needle.length()){
if(haystack[i]==needle[j]){
count++;
i++;
j++;
}
else{
j=0;
i=index+1;
break;
}
}
if(count==needle.length())
return index;
i=index+1;
j=0;
count=0;
}
else
i++;
}
return -1;
}
};
题二:最大子数和
暴力解法:算出每个元素开头的所有连续之列和,取最大返回,这种方法容易运行超时,并非最好的解决方式
int maxSubArray(vector<int>& nums) {
int sum=0;
int max=nums[0];
int i=0;
int len=nums.size();
while(i<len-1){
if(nums[i]<0&&nums[i+1]>0){
i++;
}
else{
sum=nums[i];
if(sum>max){
max=sum;
}
for(int j=i+1;j<len;j++){
cout<<"sum="<<sum<<endl;
sum=sum+nums[j];
if(sum>max){
max=sum;
}
}
i++;
}
}
if(nums[len-1]>max){
max=nums[len-1];
}
return max;
}
动态规划
//const auto &x: nums
//依次读去nums数组的元素给,并不会修改或者拷贝
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int sum = 0, maxNumber = nums[0];
for (const auto &x: nums) {
sum = max(sum + x, x);
maxNumber = max(maxNumber, sum);
}
return maxNumber;
}
};
题三:删除排序链表中的重复元素
存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除所有重复的元素,使每个元素 只出现一次 。
返回同样按升序排列的结果链表。
示例 1:
输入:head = [1,1,2]
输出:[1,2]
示例 2:
输入:head = [1,1,2,3,3]
输出:[1,2,3]
提示:
链表中节点数目在范围 [0, 300] 内
-100 <= Node.val <= 100
题目数据保证链表已经按升序排列
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list
易错点:在判断p->next是否为空时,如果p为空,直接判断p->next是否为空,程序会报错;所以必须先判断p是否为空,再判断p->next是否为空。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* deleteDuplicates(ListNode* head) {
if(head==NULL) return NULL;
ListNode *p,*q,*r;
p=head;
while(p!=NULL&&p->next!=NULL){
q=p;
r=p->next;
while(q->next!=NULL){
if(p->val==r->val){
q->next=r->next;
r=q->next;
}
else{
q=q->next;
r=q->next;
}
}
p=p->next;
}
return head;
}
};