1.乘积最大子数组
给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。
示例 1:
输入: [2,3,-2,4]
输出: 6
解释: 子数组 [2,3] 有最大乘积 6。
示例 2:
输入: [-2,0,-1]
输出: 0
解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-product-subarray
思路:
图片说明
图片说明
方案一:

class Solution {
public:
    int maxProduct(vector<int>& nums) {
        vector<int> vec1(nums),vec2(nums);//代表fmax与fmin
        for(int i=1;i<nums.size();i++)
        {
            vec1[i]=max(vec1[i-1]*nums[i],max(vec2[i-1]*nums[i],nums[i]));//找最大的数*正数,最小的数*负数,这个数的最大
            vec2[i]=min(vec1[i-1]*nums[i],min(vec2[i-1]*nums[i],nums[i]));//找最大的数*正数,最小的数*负数,这个数的最小
        }
        return *max_element(vec1.begin(),vec1.end());//返回最大值
    }
};

方案二(简化)

class Solution {
public:
    int maxProduct(vector<int>& nums) {
        int maxF = nums[0], minF = nums[0], ans = nums[0];
        for (int i = 1; i < nums.size(); ++i) {
            int mx = maxF, mn = minF;
            maxF = max(mx * nums[i], max(nums[i], mn * nums[i]));
            minF = min(mn * nums[i], min(nums[i], mx * nums[i]));
            ans = max(maxF, ans);
        }
        return ans;
    }
};

2.表示数字的字符串

class Solution {
public:
    bool isNumeric(char* string)
    {
//注意表示数值的字符串遵循的规则;
//在数值之前可能有一个“+”或“-”,接下来是0到9的数位表示数值的整数部分,如果数值是一个小数,那么小数点后面可能会有若干个0到9的数位
//表示数值的小数部分。如果用科学计数法表示,接下来是一个‘e’或者‘E’,以及紧跟着一个整数(可以有正负号)表示指数。
        if(string==NULL) return false;
        if(*string=='\0') return false;
        if(*string=='+'||*string=='-')
            string++;
        int dot=0,num=0,e=0;//记录小数点,数字和e的个数
        while(*string!='\0')
        {
            if(*string>='0'&&*string<='9')//是数字num+1,继续执行
            {
                num++;
                string++;
            }
            else if(*string=='.')
            {
                if(dot>0||e>0)
                    return false;//出现两个小数点,或e后面有小数点
                dot++;
                string++;
            }
            else if(*string=='e'||*string=='E')
            {
                if(e>0||num==0) return false;//若多余一个e或前面没数字,错误
                e++;
                string++;
                if(*string=='\0') return false;//后面要有数
                if(*string=='+'||*string=='-')
                    string++;//后面为正负号则继续
            }
            else
                return false;    
        }
        return true;
    }
};

3.字符流中第一个不重复的字符
请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"

class Solution
{
public:
  //Insert one char from stringstream
        //1、用一个128大小的数组统计每个字符出现的次数
        //2、用一个队列,如果第一次遇到ch字符,则插入队列;其他情况不在插入
        //3、求解第一个出现的字符,判断队首元素是否只出现一次,如果是直接返回,否则删除继续第3步骤
    int count[128]={0};
    queue <char> res;
    void Insert(char ch)
    {
         count[ch]++;
        if(count[ch]==1)
            res.push(ch);
    }
  //return the first appearence once char in current stringstream
    char FirstAppearingOnce()
    {
         while(!res.empty()&&count[res.front()]>=2)//如果不为空且队首元素数量大于2,则pop
             res.pop();
         if(res.empty())
             return '#';
        return res.front();
    }
};