1、最大子序和
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
解题思路:
- 定义一个函数f(n),以第n个数为结束点的子数列的最大和,存在一个递推关系f(n) = max(f(n-1) + A[n], A[n]);
- 将这些最大和保存下来后,取最大的那个就是,最大子数组和。因为最大连续子数组 等价于 最大的以n个数为结束点的子数列和 附代码
int maxSubArray(vector<int>& nums) {
if(nums.size()==0)return NULL;
int res=INT_MIN;
int f_n=-1;
for(int i=0;i<nums.size();++i){
f_n=max(nums[i],f_n+nums[i]);
res=max(f_n,res);
}
return res;
}
2、最后一个单词的长度
给定一个仅包含大小写字母和空格 ' ' 的字符串 s,返回其最后一个单词的长度。如果字符串从左向右滚动显示,那么最后一个单词就是最后出现的单词。
如果不存在最后一个单词,请返回 0 。
说明:一个单词是指仅由字母组成、不包含任何空格字符的 最大子字符串。
def lengthOfLastWord(self, s: str) -> int:
cnt,tail=0,len(s)-1
while tail>=0 and s[tail]==' ':
tail-=1
while tail>=0 and s[tail]!=' ':
cnt+=1
tail-=1
return cnt
3、加一
给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
示例 1:
输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。
class Solution {
public:
vector<int> plusOne(vector<int>& digits) {
for(int i=digits.size()-1;i>=0;i--){
digits[i]+=1;
if(digits[i]==10){
digits[i]=0;
}else{
return digits;
}
}
digits.insert(digits.begin(),1);//在数组开始的位置插入1
return digits;
}
};
4、二进制相加
给你两个二进制字符串,返回它们的和(用二进制表示)。
输入为 非空 字符串且只包含数字 1 和 0。
示例 1:
输入: a = "11", b = "1"
输出: "100"
class Solution {
public:
string addBinary(string a, string b) {
if(a=="0"&&b=="0"){
return "0";
}
int as=a.size();
int bs=b.size();
while(as<bs){
a='0'+a;
++as;
}
while(as>bs){
b='0'+b;
++bs;
}
for(int i=a.size()-1;i>0;--i){
a[i]=a[i]-'0'+b[i];
if(a[i]>='2'){
a[i] = (a[i] - '0') % 2 + '0';
b[i-1]+=1;
}
}
a[0] = a[0] - '0' + b[0];
if(a[0]>='2'){
a[0] = (a[0] - '0') % 2 + '0';
a='1'+a;
}
return a;
}
};
5、x的平方根
实现 int sqrt(int x) 函数。
计算并返回 x 的平方根,其中 x 是非负整数。
由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。
示例 1:
输入: 4
输出: 2
class Solution {
public:
int mySqrt(int x) {
if(x==1){
return 1;
}
int min=0;
int max=x;
while(max-min>1){
int m=(max+min)/2;
if(x/m<m){
max=m;
}else{
min=m;
}
}
return min;
}
};