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();
}
};