每日刷题 Day04

题一: 实现 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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值