中等难度题

本文介绍了四种编程问题的解决方案:使用双指针法求解盛最多水的容器问题,处理链表实现两数相加,处理字符串时寻找无重复字符的最长子串以及查找最长回文子串。这些题目涉及基础数据结构和算法,展示了在IT技术中常见的字符串和数组操作技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#盛最多水的容器#

思路:用双指针分别记录right和left然后依次向内推进

class Solution {
public:
    int maxArea(vector<int>& height) {
        int max=0;
        int i=0,j=height.size()-1;
        while(i<j){
            if(height[i]<height[j]){
                if(max< height[i]*(j-i))max= height[i]*(j-i);
                i++;
            }   
            else{
                if(max< height[j]*(j-i))max= height[j]*(j-i);
                j--;
            }     
        }
        return max;
    }
};

#两数相加# 

/**
 * 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* addTwoNumbers(ListNode* l1, ListNode* l2) {
        ListNode* head;
        ListNode* l;
        head=l=new ListNode(0);
        int n1,n2,carry=0;
        while(l1 || l2){
            n1=l1?l1->val:0;
            n2=l2?l2->val:0;
            ListNode* temp=new ListNode((n1+n2+carry)%10);
            carry=(n1+n2+carry)/10;
            l->next=temp;
            l=l->next;
            if(l1)l1=l1->next;
            if(l2)l2=l2->next;
        }
        if(carry>0){//这一步很容易忽视,可能会多一位
            l->next = new ListNode(carry);
        }
        return head->next;
    }
};

#无重复字符的最长子串#

思路:不仅包括字母!!!用set记录了,时间复杂度和空间复杂度都有点高

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        int maxSub=0,tempMax=0;
        set<char> sign;
        int start=0;
        for(int i=0;i<s.size();i++){
            if(sign.find(s[i])==sign.end() || s.size()==1){
                sign.insert(s[i]);
                tempMax++;
            }
            else{
                i=s.find(s[i],start);
                start=i+1;
                sign.clear();
                tempMax=0;
            }
            maxSub=max(maxSub,tempMax);
        }
        
        return maxSub;
    }
};

#最长回文子串

思路:暴力破解依次判断是否是回文。从最长依次递减,只要判断是回文串,则一定是最长回文子串。str.substr(pos,len)获取 str从pos开始,长度len的子串。(对于较长的字符串,时间太久了)

/*时间貌似太久了,提交显示超出时间限制*/
class Solution {
public:
    bool isPalindrome(string s){
        int left=0,right=s.size()-1;
        while(left<right){
            if(s[left]!=s[right])return false;
            left++;
            right--;
        }
        return true;
    }
    string longestPalindrome(string s) {
        for(int i=s.size();i>0;i--){
            for(int j=0;j+i<=s.size();j++){
                if( isPalindrome(s.substr(j,i)) ){
                    return s.substr(j,i);
                }
            }
        }
        return "";
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值