聊聊买卖股票的最佳时机

前言

大家好,我是大赛哥,好久不见,天天想念!

最近梳理高频动态规划问题,股票问题当然是非常经典的动态规划问题,并且整个系列有好几道题,这里我整理了6道股票系列的经典问题分享给大家,咱们今天聊聊买卖股票的最佳时机

想当初头一次刷股票问题时候,刷了股票问题一二三,但是完全没用到股票问题的核心思想,当时股票问题一、二不用dp反而也很容易,股票问题三当时自己想到用双向dp过的,完全没get股票问题的核心,这次重新梳理,深入get股票问题的核心思想。

ec3643cd340e94cf837e199a35617796.png

股票问题,一定要理解持有和不持有股票两个相对立状态以及其变化联系。这里持有我用hold表示、不持有用dpSell表示(最后结果基本从不持有中获得),然后有人将这两个参数整合一个参数数组,[0]表示持有[1]表示不持有,但是个人觉得那样不太直观并且效率没啥区别,所以这里对某些地方不进行优化。

另外dp问题很多时候要设大一位空间、有的从1开始遍历,很多人会混淆0、第0、第1这些东西,这里我为了减少迷糊0号位置(理论是第一个天)我就给它叫第0天统一减少混淆。

虽然说学会了还是不能学会买卖股票,但是学会了能面对面试官,认真看完你一定会有所收获!

72e5037c98b865615ecb610952fa9b58.png

买卖股票的最好时机(一)

描述:

假设你有一个数组prices,长度为n,其中prices[i]是股票在第i天的价格,请根据这个价格数组,返回买卖股票能获得的最大收益

1.你可以买入一次股票和卖出一次股票,并非每天都可以买入或卖出一次,总共只能买入和卖出一次,且买入必须在卖出的前面的某一天

2.如果不能获取到任何利润,请返回0

3.假设买入卖出均无手续费

分析:

股票问题是非常经典的动态规划问题,我们分析题目条件可以找到这些重要信息:

  • 总计只能买一次,也总计只能卖一次

  • 买在卖的前面

根据这个信息其实不用动态规划的思想我们也很容易解决,如果用普通方法也能解决,最笨的方法就是两层循环,第一层枚举每个元素第二层枚举这个元素后面的最大价格的股票,求得最大的股票差即可。

但是那样肯定是会超时的,优化一下一次枚举也可以解决这个问题,就是用一个变量min标记顺序枚举出现过的最小值,用一个变量value记录最大利润,每次枚举的数值和出现过的最小min比较是否更新min,作差比较是否更新最大利润value,最终返回最大利润即可。

实现的代码为:

public int maxProfit (int[] prices) {// write code hereif(prices.length<2)return  0;int value=0;//最大利润int min=prices[0];//记录出现的最小股票for(int i=0;i<prices.length;i++){if(prices[i]<min)//看看是否更新minmin=prices[i];if(prices[i]-min>value)//看看是否更新valuevalue=prices[i]-min;}return  value;
}

时间复杂度:O(n),空间复杂度:O(1)。

但是这个系列的问题是经典动态规划的问题,我们重点肯定还是要考虑动态规划的方法解决,这里有个持有股票和不持有股票的概念,我们用hold[]表示持有股票,dpSell[]表示不持有股票。hold[i]表示到第i天时持有股票时候的最高利润(这里暂时为负数,因为只能买一次,遇到低的股票值就更新),dpSell[i]表示第i天不持有股票时候的最大利润(这个利润要么是继承前一天的最大利润,要么是在当天卖了股票获取的利润)。

确定dp数组含义:这个问题的环境不难想出dpSell[i]为前i天不持股(已经卖出)买卖股票获得的最大利润。

确定递推式:思考hold[i]和前面数据关系,因为只能买卖一次所以这个持有仅有后面被使用有效,一旦有更低的价格就更新所以hold[i]=max(hold[i-1],-prices[i])

思考dpSell[i]和前面数据的关系,假设知道前i-1天的所有最大利润值,那么第i天获得最大利润的情况有两种:

第一种情况是第i天什么也不做,其最大利润还是前i-1天的利润(这种 情况一般来说第i天股票数据没那么亮眼),此时dpSell[i]=dpSell[i-1];第二种情况是第i天刚好卖了股票赚的利润是前i天获得的最大利润,此时需要在前i-1天手头有一支股票(并且是出现的价格最低的)才行即dpSell[i]=hold[i-1]+prices[i]

在这个关系中,不持有股票dpSell[]是跟持有股票hold[]有关系,但是hold[]持有股票是相对独立,我们可以先看持有股票的情况,然后在此基础上分析不持有股票dpSell[],通过下面案例你可以更好的理解这其中的关系:

5c76308b62eaada1ddf5e1db4bd14576.png

初始化dp数组:考虑0号位置、边缘位置以及特殊情况的一些值。这里根据递推式和实际知道只需要考虑0号位置的情况,第0天时候如果要持有只能买当天股票那么hold[0]=-prices[0],但是第0天不持有股票最大利润只能为0(不买)。

那么完整的状态转移方程为:

hold[i]=max(hold[i-1],-prices[i]) //i>=1 以前就有最低的  或者以前不持 今天才持最低的
dpSell[i]=max(dpSell[i-1],hold[i-1]+prices[i])//i>=1 今天不卖最高利润和前面一样 或者今天卖了才获得最高利润
hold[0]=-prices[0]
dpSell[0]=0

确定遍历顺序:只需要初始0号位置,从1到最后顺序进行dp递推即可。

具体实现的代码为:

public int maxProfit (int[] prices) {// write code hereint hold[]=new int[prices.length];//持有int dpSell[]=new int[prices.length];//不持有hold[0]=-prices[0];//第0 必须买 这里用负数 后面直接max比较即可dpSell[0]=0;for(int i=1;i<prices.length;i++){//持有的最大(负数其实是最便宜的) 要么前面的最便宜的 要么今天的hold[i]=Math.max(hold[i-1],-prices[i]);//不持有股票的最大利润,要么前面利润就挺大,要么今天股票价格很高和昨天持有差利润更大dpSell[i]=Math.max(dpSell[i-1],prices[i]+hold[i-1]);}return dpSell[prices.length-1];
}

时间复杂度:O(n),空间复杂度:O(n)。

买卖股票的最好时机(二)

题意

假设你有一个数组prices,长度为n,其中prices[i]是某只股票在第i天的价格,请根据这个价格数组,返回买卖股票能获得的最大收益

  1. 你可以多次买卖该只股票,但是再次购买前必须卖出之前的股票

  2. 如果不能获取收益,请返回0

  3. 假设买入卖出均无手续费

分析

这个拓展和前面问题一是有区别的,区别就是可以多次买卖股票(就是这点区别需要我们思考)但是同样每个时间段手中只能握着一支股票

如果不用动态规划的思想,其实每次就比较相邻的两个决定是否买卖也能解决这个问题,但这里我们要用动态规划的思维去解决这个问题,有了上面一题的经验,相比这题解决起来并不是特别困难,套路也是差不多的。

确定dp数组含义:同上一样,我们用hold[]表示持有股票,dpSell[]表示不持有股票,hold[i]表示到第i天持有股票的最大利润,dpSell[i]为到第i天不持股(已经卖出)买卖股票获得的最大利润。

确定递推式:思考hold[i]和前面数据关系,持股的最大利润要么不变和前i-1天一样,要么就是第i天持有股票,那么需要拿前i-1天不持有股票的最大利润加上今天的股票价格,即hold[i]=max(hold[i-1],dpSell[i-1]-prices[i]),这里注意hold[i]不一定是负数,因为有可能前面的已经赚了很多导致hold[]变大。

思考dpSell[i]和前面数据的关系,假设知道前i-1天的所有最大利润值,那么第i天获得最大利润的情况有两种:

第一种情况是第i天什么也不做,此时dpSell[i]=dpSell[i-1];第二种情况是第i天刚好卖了股票赚的利润是前i天获得的最大利润,此时需要在前i-1天手头有一支股票(并且是出现的价格最低的)才行即dpSell[i]=hold[i-1]+prices[i]

初始化dp数组:这里初始化只需要考虑0号位置的持有hold[0]=-prices[0];表示初始状态需要持有的时候必须购买。

cc4823982767a9fc60e43ddbe9f245a9.png

那么完整的状态转移方程为:

hold[i]=max(hold[i-1],dpSell[i-1]-prices[i]) //i>=1
dpSell[i]=max(dpSell[i-1],hold[i-1]+prices[i])// i>=1
hold[0]=-prices[0]
dpSell[0]=0

确定遍历顺序:从1到最后顺序进行dp递推即可。

具体实现代码为:

public int maxProfit(int[] prices) {int hold[]=new int[prices.length];//持有int dpSell[]=new int[prices.length];//不持有hold[0]=-prices[0];//初始化 持有只能买dpSell[0]=0;for(int i=1;i<prices.length;i++){//持有最大 要么前一个i-1最大,要么前一个不持股最大买第i个hold[i]=Math.max(hold[i-1],dpSell[i-1]-prices[i]);//不持股最大 要么前一个i-最大,要么前一个i-1持有最大然后第i天卖了dpSell[i]=Math.max(dpSell[i-1],prices[i]+hold[i-1]);} return dpSell[prices.length-1];
}

时间复杂度:O(n),空间复杂度:O(n)。

买卖股票含冷冻期

描述

给定一个整数数组prices,其中第 prices[i] 表示第 i 天的股票价格 。

设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):

卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。

分析

这个问题和前一个问题很相似,就不详细展开详细讲解,我们考虑一下冷冻期对谁影响了就可以。

递推分析:我们考虑持有和不持有两个递推式有什么变化:

hold[i]第i天持有股票的最大值,第一种可能不做事继承前一天hold[i-1]是完全有可能的,第二种情况就是我想今天买入,但是卖出的话第二天无法买入有一天冷冻期,所以想今天(第i天)买入只能在第i-2天卖出不持有,然后第i-1天为冷冻期,今天第i天才能买入。

dpSell[i]第i天不持有股票的最大值,第一种可能不做事继承前一天dpSell[i-1]是完全有可能的,第二种情况就是我想今天卖出,那么前一天买第二天卖是可行的(不受冷冻期影响,冷冻只会冻结卖后的一天不能买),所以第二种可能就是前一天第i-1天持有的最大然后今日卖出加上prices[i]

那么递推式:

hold[i]=max(hold[i-1],dpSell[i-2]-prices[i]);
dpSell[i]=max(dpSell[i-1],hold[i-1]+prices[i]);

初始化考虑:根据递推式知道买入时候可能和前面两个数据有关系,所以我们需要初始0、1两个位置的数据,hold[0]=-prices[0]表示当天持有必买第0天,而hold[1]=max(-prices[0],-prices[1]);则是选择两天比较低的股价(因为这时候不会产生卖出的利润)。dpSell[0]=0表示最大利润为0,dpSell[1]=max(0,hold[0]+prices[1])表示最大要么是0,要么是昨天买今天卖。

确定遍历顺序:初始0,1号位置数据,从2开始遍历到最后递推即可。

具体实现代码为:

public int maxProfit(int[] prices) {if(prices.length<=1)return 0;int hold[]=new int[prices.length];int dpSell[]=new int[prices.length];hold[0]=-prices[0];hold[1]=Math.max(-prices[0],-prices[1]);dpSell[1]=Math.max(dpSell[0],hold[0]+prices[1]);for(int i=2;i<prices.length;i++){hold[i]=Math.max(hold[i-1],dpSell[i-2]-prices[i]);dpSell[i]=Math.max(dpSell[i-1],hold[i-1]+prices[i]);}return dpSell[prices.length-1];
}

时间复杂度:O(n),空间复杂度:O(n)。

买卖股票的最佳时机含手续费

描述

给定一个整数数组 prices,其中 prices[i]表示第 i 天的股票价格 ;整数 fee 代表了交易股票的手续费用。

你可以无限次地完成交易,但是你每笔交易都需要付手续费。如果你已经购买了一个股票,在卖出它之前你就不能再继续购买股票了。

返回获得利润的最大值。

分析

有了前面解决问题的基础,这个问题也不难解决了,其实这个问题和无限次购买区别不大,只是每次购买都有手续费。分析一下持有和不持有两种状态推导:

hold[i]继承前一天,或者前一天不持有最大减去今日股价,递推方式没变化。

dpSell[i]继承前一天,或者前一天持有最大加上今日股价,再加上fee的手续费,递推变化一点点。

递推式为:

hold[i]=max(hold[i-1],dpSell[i-1]-prices[i]);
dpSell[i]=max(dpSell[i-1],hold[i-1]+prices[i]-fee);

具体实现代码为:

public int maxProfit(int[] prices, int fee) {int hold[]=new int[prices.length];int dpSell[]=new int[prices.length];hold[0]=-prices[0];for(int i=1;i<prices.length;i++){hold[i]=Math.max(hold[i-1],dpSell[i-1]-prices[i]);dpSell[i]=Math.max(dpSell[i-1],hold[i-1]+prices[i]-fee);}return dpSell[prices.length-1];
}

时间复杂度:O(n),空间复杂度:O(n)。

买卖股票的最好时机(三)

描述

假设你有一个数组prices,长度为n,其中prices[i]是某只股票在第i天的价格,请根据这个价格数组,返回买卖股票能获得的最大收益

  1. 你最多可以对该股票有两笔交易操作,一笔交易代表着一次买入与一次卖出,但是再次购买前必须卖出之前的股票

  2. 如果不能获取收益,请返回0

  3. 假设买入卖出均无手续费

分析

其实这个问题比起上面就难一些,这里面提供两个思考的角度。

方法一:左右两个方向dp

前面我们解决过只能买卖一次的动态规划思路解决这个问题,但是股票买卖获取利润的实质是:低买高卖

一般来说是从左向右进行枚举,但是想一下从右向左可以不?当然可以啊,从左向右就是记录一个最低价的股票与枚举值进行差值计算利润。而从右向左同样记录最大值然后向左枚举计算差值可以算出从右向左这个区间的最大利润。

知道从左向右和由右向左两个方向,有什么作用呢?两次买卖股票,对应两个区间一个左侧一个右侧,那么我们分别计算从左向右的买一次最大利润和从右向左计算买入一次的最大利润,然后每个位置dpLeft[i]和dpRight[i]值相加得到一个最大的即可!

1733bff49aad54a65fec7c258cea12ad.png

public int maxProfit(int[] prices) {int dpleft[]=new int[prices.length];//从左向右的最大利润int dpright[]=new int[prices.length+1];//从右向左的最大利润if(prices.length<2)return  0;int value=0;//记录最大的那个int low=prices[0];for(int i=1;i<prices.length;i++){dpleft[i]=dpleft[i-1];//先继承左侧,然后判断买卖是否能够获得更大利润if(prices[i]<low) {//看看能否更新买入的最低值low = prices[i];continue;}int num=prices[i]-low;//看看dp值有没有更新if(num>dpleft[i-1]) {dpleft[i] =num;}}int high=prices[prices.length-1];for(int i=prices.length-2;i>=0;i--){dpright[i]=dpright[i+1];if(prices[i]>high){high=prices[i];continue;}int num=high-prices[i];//看看dp值有没有更新if(num>dpright[i+1]){dpright[i]=num;}}for(int i=1;i<prices.length;i++){int money=dpleft[i]+dpright[i];if(money>value)value=money;}return  value;
}

时间复杂度:O(n),空间复杂度:O(n)。

法二:顺序两次dp

上面方法属于一个小技巧,但是这个问题如果常规的从左向右正常思维解决该如何处理呢?

确定dp数组含义:我们分析一下这个过程,正常买卖两次股票有四个步骤同时也对应四个数组:第一次(买入)持有hold1[],第一次(卖出)不持有dpSell1[],第二次(买入)持有hold2[],第二次(卖出)不持有dpSell2[]。

确定递推式:我们需要分析这些数据有什么关系,我们根据前面的问题很清楚hold1和dpSell1是有关系的,在这里我把他们的关系再给大家梳理一遍:

  • 第一次买入hold1[i]:要么和第i-1天第一次持有的最大利润相同,要么就是-prices[i]第一次持有最大利润,即hold1[i]=max(hold[i-1],-prices[i])

  • 第一次不持有dpSell1[i]:要么和第i-1天第一次不持有dpSell1[i]相同,要么和第i-1天第一次持有利润加上第i天价格(卖出),即dpSell1[i]=max(dpSell[i-1],hold1[i-1]+price[i])

  • 第二次持有hold2[i]:要么和i-1天第二次持有的最大利润相同,要么就是第i-1天第一次不持有的最大利润减去prices[i],即要么不动跟昨天一样,要么就是昨天第一次不持有(昨天已经买卖第一次)然后今天再买入时候最大,即hold2[i]=max(hold2[i-1],dpSell1[i-1]-prices[i])

  • 第二次不持有dpSell2[i]:要么和第i-1天第二次不持有最大利润相同,要么和第i-1天第二次持有利润加上第i天价格(卖出),即mdpSell2[i]=ax(dpSell2[i-1],hold2[i-1]+prices[i])

dbcd9fb859e5380c5c1eeb3c543674f1.png

初始化dp数组:hold1[0]=hold2[0]=-prices[0],即第一次第二次买入时候均购买第0天价格股票。

确定遍历顺序:只需要初始0号位置,从1开始顺序枚举同时进行第一次第二次的动态规划递推。

实现的代码为:

public int maxProfit (int[] prices) {// write code hereint hold1[]=new int[prices.length];//第一次持有int dpSell1[]=new int[prices.length];//第一次不持有int hold2[]=new int[prices.length];//第二次持有int dpSell2[]=new int[prices.length];//第二次不持有hold1[0]=hold2[0]=-prices[0];for(int i=1;i<prices.length;i++){hold1[i]=Math.max(hold1[i-1],-prices[i]);dpSell1[i]=Math.max(dpSell1[i-1],prices[i]+hold1[i-1]);hold2[i]=Math.max(hold2[i-1],dpSell1[i-1]-prices[i]);dpSell2[i]=Math.max(dpSell2[i-1],hold2[i-1]+prices[i]);}return dpSell2[prices.length-1];
}

时间复杂度:O(n),空间复杂度:O(n)。

买卖股票的最好时机(四)

描述

1 你最多可以对该股票有k笔交易操作,一笔交易代表着一次买入与一次卖出,但是再次购买前必须卖出之前的股票
2 如果不能获取收益,请返回0
3 假设买入卖出均无手续费

分析

这个问题和买卖股票的最好时机(三)有些相似,但是是它的变形题。相信到这里,你对持有股票hold、不持有股票dpSell的最大利润的概念已经理解的很透彻了。咱们前面的问题都是主要在搞明白持有股票hold、不持有股票dpSell最大利润之间以及天数i的联系。

我们简单回顾一下前面的股票问题主要的状态转移方程:

股票问题(一)只能购买一次,持有可以继承前一天或者选今天最低-prices[i](本来是0持有后花钱就变成负的了),不持有可以继承前一天最低或计算今天出售利润选择高的那个。

hold[i]=max(hold[i-1],-prices[i]) 
dpSell[i]=max(dpSell[i-1],hold[i-1]+prices[i])

股票问题(二)可购买股票多次,这时候不持有dpSell[i]和买卖股票(一)其实是没区别的,要么继承前一天,要么今日股价加上截止昨日不持有的最大利润;

但是持有股票hold[i]的最大利润计算方式有所变化,这里面允许多次交易,那么持有最大的利润就是前一天不持有的最大利润dpSell[i-1]加上今天的股价(即今天卖出)或者今天不动继承昨天的最大利润。股票(一)受到只能买一次影响所以不能使用前一天不持有d最大利润来计算。

hold[i]=max(hold[i-1],dpSell[i-1]-prices[i]) 
dpSell[i]=max(dpSell[i-1],hold[i-1]+prices[i])

股票问题(三)可以购买两次,这个和只能买一次和购买任意次又有所区别,但是前面也分析过购买一次(hold1[i]dpSell1[i])是和前面股票(一)是一样处理。

但是购买第二次的问题考虑是在购买第一次的基础上的。第二次持有hold2[i]要么继承前一天要么是前一天第一次不持有(dpSell1[i])然后今日购买;第二次不持有dpSell2[i]要么继承前一天要么是前一天第二次持有最大加上今日股价(今天卖掉)。

hold1[i]=max(hold1[i-1],-prices[i]);
dpSell1[i]=max(dpSell1[i-1],hold1[i-1]+prices[i]);hold2[i]=max(hold2[i-1],dpSell1[i-1]-prices[i]);
dpSell2[i]=max(dpSell2[i-1],hold2[i-1]+prices[i]);

其实这个问题和股票(三)问题很相似,股票一二是弄明白股票利润与天数的关系,股票三是弄明白两次买卖股票的关系,而这个问题允许买卖K次股票(同时手中只允许有一支股票),我们来详细分析一下这个问题:

确定dp数组含义:股票三买卖两次我们创建了两对数组,这个k次当然要提高维度来解决,创建hold[prices.length][k+1]dpSell[prices.length][k+1],其中hold[i][j+1]表示第i天第j次持有股票的最大利润,dpSell[i][j+1]表示第i天第j次不持有股票的最大利润,至于为什么设置成k+1后面再说明。

确定递推式:我们要分析hold[i][j]dpSell[i][j]和前面数据之间的关系。

hold[i][j]到第i天第j次持有,它的值可能是前一天(i-1)持有j次最大值hold[i-1][j],另外一个可能情况是前一天(i-1)的第j-1次不持有最大然后买入今日股票(昨天刚卖了,然后今天买入),即dpSell[i-1][j-1]-prices[i]

dpSell[i][j]到第i天第j次不持有,它的值可能是前一天(i-1)不持有j次最大值dpSell[i-1][j],还有可能是前一天(i-1)的第j次持有最大然后卖出今日股票(昨天的第j次买入最大,然后今天卖了),即hold[i-1][j]+prices[i]

这个持有和不持有对应的其实是这么一个二维结构:

2a5e16aa6fd95f50e8b59672365f5003.png

总结一下除了继承前一天的持有或者不持有之外:

hold持有:前一天(i-1)的上次(j-1)不持有减去今日股价。(前一次不持有买卖结束了,再买就是下一次)

dpSell不持有:前一天(i-1)的这次(j)持有加上今日股价。(前一次持有,说明还没卖出去,那么这一次j还没结束,自己计算完才算结束)

完整递推式为:

hold[i][j]=max(hold[i-1][j],dpSell[i-1][j-1]-prices[i]);//前一天同次数 或者前一天不持有上一次的 今天买
dpSell[i][j]=max(dpSell[i-1][j],hold[i-1][j]+prices[i]);//前一天同次数 或者前一天持有的通次 今天卖

初始化dp数组:根据前面递推,和前面初始化,我们知道第0天持有必须购买prices[0]的股票,所以不管第0天的第几次持有dp[0][j]=0,但是上面根据公式知道第j次可能会用到j-1,这里j是我们新定义的一个含义变量,我们让它从1开始计数,让0号位置的数据能够满足初始递推成功进行即可,就不用考虑j初始的特殊情况了,所以前面的k+1是这么来的。

确定遍历顺序:外层i从1开始到prices.length-1枚举里面处理第i天的持有和不持股票有最大利润,内层j从1到k表示表示计算这第i天第j次购买的最大利润(i天数从0开始有效计数,j次数从1开始有效计数)。

具体实现代码为:

public int maxProfit(int k, int[] prices) {if(prices.length==0)return 0;int hold[][]=new int[prices.length][k+1];int dpSell[][]=new int[prices.length][k+1];for(int i=1;i<k+1;i++){hold[0][i]=-prices[0];}hold[0][0]=-prices[0];for(int i=1;i<prices.length;i++){for(int j=1;j<k+1;j++){hold[i][j]=Math.max(hold[i-1][j],dpSell[i-1][j-1]-prices[i]);dpSell[i][j]=Math.max(dpSell[i-1][j],hold[i-1][j]+prices[i]);}}//System.out.println(Arrays.deepToString(dpSell));return dpSell[prices.length-1][k];}

结语

到这里,动态规划系列的股票问题就介绍完毕了,后面还会分享一些其他经典问题。

文中一些内容可能写的比较粗糙或者有差错,有细心的大佬发现问题还请指出!会更新到我的仓库中,大家阅读原文可以支持一下!

这个忙碌的日子里,大家一起卷起来!

推荐阅读:

  打家劫舍的智慧!

  备战蓝桥杯  这样准没错!

  动态规划,它来了

  必须干掉这10道,面试100%遇到!

欢迎关注 「bigsai」,后台加我拉你进力扣打卡小队

原创不易,希望路过彦祖仙女点个赞、再看

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/8749.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蹭下ChatGPT的热度哈哈

今天注册了个ChatGPT,感觉用处超级大&#xff0c;能写sci论文的那种大哈哈。当然&#xff0c;使用chatGPT写论文百分之九十会被查出来。但是我们可以用它来辅助写文章呀&#xff0c;翻译些句子呀&#xff0c;读不懂别人写的某句话可以让它转述一下呀。哈哈偷偷告诉你&#xff0…

3,自然发音

hour h不发音&#xff0c;所以是 开头母音&#xff0c; an hour oy 发 ao i oa 两个母音 在一块&#xff0c;大部分只发前面的那个母音。 furkid s 【秒懂释义】猫、狗等宠物。就是现在很多人把宠物当做小孩&#xff0c;所以是fur(毛)kids(小孩) ell 英 [bel] 美 [bɛl] n. …

c语言火车购票csp真题,CCF CSP 201312-3 最大的矩形

CCF CSP 201312-3 最大的矩形 问题描述 在横轴上放了n个相邻的矩形&#xff0c;每个矩形的宽度是1&#xff0c;而第i(1 ≤ i ≤ n)个矩形的高度是hi。这n个矩形构成了一个直方图。例如&#xff0c;下图中六个矩形的高度就分别是3, 1, 6, 5, 2, 3。 请找出能放在给定直方图里面积…

Vant Weapp - 去除(清除)<van-button> 按钮组件点击出现灰色背景效果

前言 正常引入组件后&#xff0c;点击按钮时会出现如下图所示灰色背景效果&#xff1a; 解决方案 TIPS&#xff1a;如果您是小程序普通组件按钮&#xff0c;请参考 官方文档&#xff0c;设置属性 hover-class"none" 即可去掉点击效果。 打开按钮组件所在 wxss 文件…

Win32反汇编(七)浮点指令(FLD / FILD / FSTP)与位移指令的逆向分析

前言 作者&#xff1a;浪子花梦&#xff0c;一个有趣的程序员 ~ 此系列文章都是一些基础的文章&#xff0c;每篇文章都通过几个小例子快速的了解 Win32反汇编与OD的使用&#xff0c;在此作个笔记 如若对您有帮助&#xff0c;记得三连哟 ~ 前文链接 Win32反汇编&#xff08;一&…

Django models Fild详解

本文参考自&#xff1a;django官方文档models/field 在model中添加字段的格式一般为&#xff1a; field_name field_type(**field_options) 一 field options(所有字段共用) 1 null 默认为False&#xff0c;True则表示可以为null。&#xff08;空字符串在数据库中可能被存…

SQlite3(轻型数据库)

1. main.m文件 #import <Foundation/Foundation.h> #import "SQLManger.h"int main(int argc, const char * argv[]) {autoreleasepool {// insert code here...NSLog("Hello, World!");SQLManger* sql [SQLManger shareSqlManger];[sql createTab…

我和ChatGPT聊了聊:它承认自己没有人性

我认为ChatGPT未来也许可以取代那些 重复 可以模板 固定公式 运作的工作 但是很难取代 定制化 人性化的工作 最近ChatGPT太火了&#xff0c;已经从好几个不同的渠道接触到了它&#xff0c;自然是整了一个去玩玩&#xff0c;零零散散问了它一些问题&#xff0c;答案还挺有意思的…

有了ChatGPT,还需要操作系统吗?|CCF C³

杨净 发自 凹非寺量子位 | 公众号 QbitAI 大模型引领的AI 2.0&#xff0c;远比想象来得更加猛烈。 尤其是被认为最先被颠覆的搜索引擎领域&#xff0c;产学研界都蠢蠢欲动&#xff0c;对可预见的趋势展开激辩。 没有了用户点击&#xff0c;内容提供商/广告该怎么办&#xff1f;…

震惊!外国小哥用ChatGPT完成80%工作,同时打4份工

【导读】自从ChatGPT火了以后&#xff0c;办公室白领可真是爽翻了。甭管什么任务&#xff0c;交给ChatGPT&#xff0c;准没错。 不少白领在工作中都用上了ChatGPT&#xff0c;堪称如虎添翼。 毕竟&#xff0c;很多工作都是重复的、有章可循的。 既然有了科技力量的加持&#xf…

ChatGPT会对未来5年的NLP算法从业者带来怎样的冲击?

周末看到知乎的一个问题&#xff0c;有点意思&#xff0c;值得NLPer思考&#xff0c;选取几个回答&#xff0c;欢迎留言。 问题&#xff1a;ChatGPT的诞生意味着模型大一统的可行性&#xff0c;这会对未来5年的NLP算法从业者带来怎样的冲击&#xff1f; 我个人从ChatGPT上看到了…

OpenAI 账户验证流程存在漏洞,可导致用户无限薅羊毛

聚焦源代码安全&#xff0c;网罗国内外最新资讯&#xff01; 编译&#xff1a;代码卫士 Checkmarx 公司指出&#xff0c;OpenAI 的账户验证流程中存在一个漏洞&#xff0c;可导致任何人使用同一个电话号码注册新账户后&#xff0c;获得无限制的服务额度。 作为人工智能公司&…

赚翻了!外国小哥用ChatGPT完成80%工作,同时打4份工

Datawhale分享 最新&#xff1a;ChatGPT应用&#xff0c;编辑&#xff1a;新智元 【导读】自从ChatGPT火了以后&#xff0c;办公室白领可真是爽翻了。甭管什么任务&#xff0c;交给ChatGPT&#xff0c;准没错。 不少白领在工作中都用上了ChatGPT&#xff0c;堪称如虎添翼。 毕…

ShardingJDBC读写分离

ShardingJDBC是什么 看一看ChatGPT对他的解释&#xff1a; ShardingJDBC是一个数据库连接池&#xff0c;它为数据库的分片和读/写拆分提供支持。它允许您跨多个物理数据库和服务器分发数据&#xff0c;并根据设置的配置将读写操作路由到适当的数据库。 以下是它的工作原理&…

为什么总是闹离职的员工没走,平时不吭声的员工却突然离职?

上一篇&#xff1a;华为“天才少年”稚晖君被曝离职&#xff01;两年前加入年薪百万起步的天才少年计划&#xff01; 相信工作过几年的朋友都遇到过类似的现象&#xff1a;总是闹离职的员工没走&#xff0c;平时不吭声的员工却突然离职。 其实很正常&#xff0c;总是闹离职的说…

盘点海外 AIGC 独角兽创始人,中国何时迎来自己的高光时刻?

据不完全统计&#xff0c;全球 AIGC 创业公司中估值在 10 亿美元以上的已经多达 10 家。包括推出 ChatGPT 的 OpenAI&#xff0c;因《太空歌剧院》而走红的 Midjourney 等。这些独角兽背后的创业者都是谁&#xff1f;他们又是如何成为时代的开创者&#xff1f;本篇文章带你一看…

适合程序员使用的 ChatGPT!!!

ChatGPT 不仅能解决亲情&#xff0c;友情&#xff0c;爱情等非常热门的问题&#xff0c;还能帮助程序员在开发中反复测试自己的代码或者切磋技艺。 例如&#xff0c;作为程序员的我们&#xff0c;只要在ChatGPT上轻轻松松地输出我们的需求&#xff0c;“null pointer怎么解决啊…

1 分钟高效集成 ChatGPT,Stable Diffusion 等 AIGC 模型最强教程

1 分钟能做什么&#xff1f;集成 ChatGPT 到自己的公众号&#xff0c;小程序或者 APP&#xff1f;集成各种形式的 Stable Diffusion&#xff0c;让 AIGC 帮助自己的项目更有趣&#xff0c;更生动&#xff1f;本教程将会教大家如何 1 分钟高效集成 ChatGPT&#xff0c;Stable Di…

【起飞】让你电脑速度快到飞起的一些牛逼的设置整理【电脑卡顿反应慢等问题解决】

对于开发来说电脑的反应速度简直影响了思维的速度&#xff0c;要让电脑速度跟上我们的思维&#xff0c;提高工作效率&#xff0c;早点打卡下班回家陪老婆孩子哈哈 这篇文章主要对windows系统做的一些优化&#xff0c;是真的好用&#xff0c;仿佛在访问静态页面一样&#xff0c;…

【Redis】孔夫子旧书网爬虫接入芝麻代理IP:代理IP利用效率最大化

背景&#xff1a; 之前用过芝麻IP&#xff0c;写过这几篇文章 《【Python】芝麻HTTP代理系列保姆级全套攻略(对接教程自动领取每日IPIP最优算法)》 《【Python】记录抓包分析自动领取芝麻HTTP每日免费IP&#xff08;成品教程&#xff09;》 《爬虫增加代理池&#xff1a;使用稳…