leetcode_3.20_3.21

1.给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法。
https://leetcode-cn.com/problems/set-matrix-zeroes/
思路:
在这里插入图片描述

class Solution {
public:
    void setZeroes(vector<vector<int>>& matrix) {
        bool h=false,l=false; 
        //遍历第一行第一列
        for(int i=0;i<matrix[0].size();i++){
            if(matrix[0][i]==0){
                h=true;
                break;
            }
        }
        for(int i=0;i<matrix.size();i++){
            if(matrix[i][0]==0){
                l=true;
                break;
            }
        }
        //从第二行开始遍历
        for(int i=1;i<matrix.size();i++){
            for(int j=1;j<matrix[i].size();j++){
                if(matrix[i][j]==0){
                    matrix[i][0]=0;
                    matrix[0][j]=0;
                }
            }
        }
        for(int i=1;i<matrix[0].size();i++){
            if(matrix[0][i]==0){
                for(int j=1;j<matrix.size();j++){
                    matrix[j][i]=0;
                }
            }
        }for(int i=1;i<matrix.size();i++){
            if(matrix[i][0]==0){
                for(int j=1;j<matrix[i].size();j++){
                    matrix[i][j]=0;
                }
            }
        }
        if(matrix[0][0]==0){
            for(int j=1;j<matrix[0].size();j++){
                    matrix[0][j]=0;
                }
                for(int j=1;j<matrix.size();j++){
                    matrix[j][0]=0;
                }
        }else{
             if(h==true){
            for(int j=0;j<matrix[0].size();j++){
                    matrix[0][j]=0;
                    printf("[0,%d]\n",j);
                }}
        if(l==true){
            for(int j=0;j<matrix.size();j++){
                    matrix[j][0]=0;
                    printf("[%d,0]\n",j);
                }}
        }
    }
};

2.给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
注意点:当字符串为空,特殊判断。
代码:

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        if(s.length()==0){
            return 0;
        }
        int begin=0,end=0;//当前子串的开始位置和结束位置(均包含在子串内)
        int max=1;//当前最大子串长度
        for(int i=end+1;i<s.length();i++){
            string now=s.substr(i,1);
            for(int j=begin;j<=end;j++){
                string check=s.substr(j,1);
                if(check==now){
                    if((end-begin+1)>max){
                        max=end-begin+1;
                    }
                    begin=j+1;
                    break;
                }
            }
            end=i;
        }
        if((end-begin+1)>max){
            max=end-begin+1;
        }
        return max;
    }
};

3.给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0 开头。
https://leetcode-cn.com/problems/add-two-numbers/
注意点:1.多余的m或n要和进位相加2.最后还要判断余数是否为零
代码:

/**
 * 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) {
        int c=0,value;
        ListNode* root =new ListNode(0);
        ListNode* cursor=root;
        //相加
        while(l1 != nullptr && l2 != nullptr){
            c+=l1->val+l2->val;
            if(c>9){
                value=c%10;
                c=c/10;
            }else{
                value=c;
                c=0;
            }
            ListNode* sumNode=new ListNode(value);
            cursor->next=sumNode;
            cursor=sumNode;
            l1=l1->next;
            l2=l2->next;
        }
        //多余位补上
        if(l1!=nullptr){
            while(l1!=nullptr){
                c+=l1->val;
                 if(c>9){
                value=c%10;
                c=c/10;
            }else{
                value=c;
                c=0;
            }
            ListNode* sumNode=new ListNode(value);
            cursor->next=sumNode;
            cursor=sumNode;
                l1=l1->next;
            }
        }else if(l2!=nullptr){
             while(l2!=nullptr){
                c+=l2->val;
                 if(c>9){
                value=c%10;
                c=c/10;
            }else{
                value=c;
                c=0;
            }
            ListNode* sumNode=new ListNode(value);
            cursor->next=sumNode;
            cursor=sumNode;
                l2=l2->next;
            }
        }
        if(c!=0){//补回C
            ListNode* sumNode=new ListNode(c);
            cursor->next=sumNode;
        }
        return root->next;
    }
};

4.根据 逆波兰表示法,求表达式的值。
有效的算符包括 +、-、*、/ 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。
https://leetcode-cn.com/problems/evaluate-reverse-polish-notation/
思路:遇见数字入栈,遇见符号出栈前两个,注意两个操作数的先后顺序!
代码:

class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        stack<int> s;
    for(int i=0;i<tokens.size();i++){
        int a,b;
        if(tokens[i]=="+"){
            a=s.top();
            s.pop();
            b=s.top();
            s.pop();
            a+=b;
            s.push(a);
        }else if(tokens[i]=="-"){
            a=s.top();
            s.pop();
            b=s.top();
            s.pop();
            b-=a;
            s.push(b);
        }else if(tokens[i]=="*"){
            a=s.top();
            s.pop();
            b=s.top();
            s.pop();
            a*=b;
            s.push(a);
        }else if(tokens[i]=="/"){
            a=s.top();
            s.pop();
            b=s.top();
            s.pop();
            b/=a;
            s.push(b);
        }else{
            s.push(stoi(tokens[i]));
        }
    }
    return s.top();
    }
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值