20240310

leetcode134(代码随想录题目)

思路:

通过下图的数学推导

可得到从x,y之间的任何一个加油站出发,都无法到达加油站 y的下一个加油站,因此首先检查第0个加油站,并试图判断能否环绕一周,如果不能,就从第一个无法到达的加油站开始继续检查,若检查到最后一个都不能,则返回-1。

更通俗的理解是:若从x加油站出发经过z最远能到达y加油站,那么从z加油站直接出发,不可能到达y下一个加油站,因为从x出发到z加油站时肯定还有存储的油,在这种情况下都到不了y的下一站,而直接从z出发刚开始是没有存储的油的,所以更不可能到达y的下一站。

class Solution {
    public int canCompleteCircuit(int[] gas, int[] cost) {
        int n = gas.length;
        int i = 0;
        while(i < n){
            int sunCost = 0, sumGas = 0;
            //目前能环游的数量
            int count = 0;
            //检查从i开始是否能环游一周
            while(count < n){
                sunCost += cost[(count + i) % n];//取模的原因是走到下标为n - 1的加油站后重新走到下标为0的加油站
                sumGas += gas[(count + i) % n];
                //目前需要消耗的油量大于目前最多存储的油量,则不能到达下一站
                if(sunCost > sumGas){
                    break;
                }
                count++;
            }
            //已经过了n个点
            if(count == n){
                return i;
            }else{
                //从第一个不能到达的加油站开始
                i = i + count + 1; 
            }
        }
        return -1;
    }
}

HTTP缓存技术

HTTP缓存技术分为强制缓存和协商缓存两种方式,两种方式的原理如下:

强制缓存

该方法指只要浏览器判断缓存没有过期,则直接使用浏览器的本地缓存,强制缓存通过Cache-Control(相对时间)、Expires(绝对时间)这两个HTTP头部实现,若HTTP响应头部同时有这两个字段,则Cache-Control优先级更高,实现的流程如下:

1、当浏览器第一次请求访问服务器资源时,服务器会在返回这个资源的同时,在Response头部加上Cache-Control,Cache-Control中设置了过期时间大小;

2、浏览器再次请求访问服务器中的该资源时,会先通过请求资源的时间与Cache-Control中设置的过期时间大小,来计算出该资源是否过期,如果没有,则使用该缓存,否则重新请求服务器;

3、服务器再次收到请求后,会再次更新Response头部的Cache-Control。

协商缓存

协商缓存指的是与服务端协商之后,通过协商结果来判断是否使用本地缓存,其基于两种头部实现:

1、请求头部中的If-Modified-Since字段与响应头部中的Last-Modified字段

Last-Modified标示这个响应资源的最后修改时间,当资源过期时,发现响应头中具有Last-Modified声明,则再次发起请求的时候带上Last-Modified的时间,服务器收到请求后发现有If-Modified-Since,则将再次发起请求时带上的时间与被请求资源的最后修改时间进行对比(Last-Modified),如果最后修改时间较大,说明资源又被改过,则返回最新资源,HTTP 200 OK;如果最后修改时间较小,说明资源无新修改,响应HTTP 304走缓存。(基于时间实现)

2、请求头部中的If-None-Match字段与响应头部中的ETag字段

响应头部中Etag为唯一标识响应资源,当资源过期时,浏览器发现响应头里有 Etag,则再次向服务器发起请求时,会将请求头If-None-Match值设置为Etag的值,服务器收到请求后进行比对,如果资源没有变化返回304,如果资源变化了返回200。(基于一个唯一标识实现)

上述方法中,方法2可以更加准确地判断文件内容是否被修改,避免由于时间篡改导致的不可靠问题。

若在第一次请求资源的时候,服务端返回的HTTP响应头部同时有Etag和Last-Modified字段,那么客户端再下一次请求的时候,如果带上了ETag和Last-Modified字段信息给服务端,则Etag的优先级更高,如果Etag有变化就不用在判断Last-Modified了,如果Etag没有变化,再看Last-Modified。

协商缓存这两个字段都需要配合强制缓存中Cache-Control字段来使用,只有在未能命中强制缓存的时候,才能发起带有协商缓存字段的请求。

中央处理器

即CPU,32位和64位CPU最主要区别在于一次能计算多少字节数据,32位CPU一次可以计算 4 个字节,64 位CPU一次可以计算8 个字节;CPU内部还有一些组件,主要包含寄存器、控制单元和逻辑运算单元等,其中,控制单元负责控制 CPU 工作,逻辑运算单元负责计算,而寄存器可以分为多种类,每种寄存器的功能又不尽相同。

寄存器存在的目的:内存离CPU太远,但寄存器就在CPU里,离控制单元和逻辑运算单元很近,计算时速度会很快。

常见的寄存器:

1、通用寄存器,用来存放需要进行运算的数据,如需要进行加和运算的两个数据。

2、程序计数器,用来存储 CPU 要执行下一条指令所在的内存地址。

3、指令寄存器,用来存放当前正在执行的指令,指令被执行完成之前,都存储在指令寄存器。

总线

总线是用于CPU和内存以及其他设备之间的通信,可分为3种:

1、地址总线,用于指定 CPU 将要操作的内存地址;

2、数据总线,用于读写内存的数据;

3、控制总线,用于发送和接收信号,如中断、设备复位等信号。

当CPU要读写内存数据的时候,一般需要依次通过地址总线来指定内存的地址、控制总线控制是读或写命令、数据总线来传输数据

全部评论

相关推荐

点赞 评论 收藏
转发
1 收藏 评论
分享
牛客网
牛客企业服务