diff --git "a/2022/07/20/Markdown \347\232\204\350\257\255\346\263\225/index.html" "b/2022/07/20/Markdown \347\232\204\350\257\255\346\263\225/index.html" index 7e4da309..c25140b9 100644 --- "a/2022/07/20/Markdown \347\232\204\350\257\255\346\263\225/index.html" +++ "b/2022/07/20/Markdown \347\232\204\350\257\255\346\263\225/index.html" @@ -141,7 +141,7 @@ } } detectApple() - })(window)
加载中...

Markdown 语法

Markdown 基本语法一

1.标题

1
2
3
4
# 一级标题
## 二级标题
...
###.. n级标题
+ })(window)
加载中...

Markdown 语法

Markdown 基本语法一

1.标题

1
2
3
4
# 一级标题
## 二级标题
...
###.. n级标题

应该是# 标题而不是#标题,在非标准文本编辑器中会报错.

2.强调

1
2
**Hello world**
__ABCD__

Hello world

@@ -310,7 +310,7 @@

更多

官网](http://markdown.p2hp.com/basic-syntax/#code))

-

评论

评论
avatar
Jc Zhang
Follow Me
公告
This is my Blog
加载中...

Hello World

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

+ })(window)
加载中...

Hello World

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server
@@ -150,7 +150,7 @@

Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment

-

评论

评论
公告
This is my Blog
加载中...

my-first-blog


评论
公告
This is my Blog
加载中...

my-first-blog


评论
公告
This is my Blog
加载中...

Hexo x Github的常用指令

Hexo x Github常用指令

hexo s

在blog目录下:

+ })(window)
加载中...

Hexo x Github的常用指令

Hexo x Github常用指令

hexo s

在blog目录下:

1
hexo s

预览博客,返回一网页地址

更换主题

主题

@@ -164,7 +164,7 @@

方法

上传到github命令

hexo g -d

-

评论

评论
加载中...

线性规划

线性规划

我想计算一个线性方程组方程组的解

+ })(window)
加载中...

线性规划

线性规划

我想计算一个线性方程组方程组的解

1
2
3
4
5
6
7
8
9
10
11
12
13
from pickletools import optimize
import numpy as np
from scipy.optimize import linprog

c = np.array([-2,-3,5])
Aeq = np.array([[1,1,1]])
beq = np.array([7])
A = np.array([[-2,5,-1],[1,3,1]])
b = np.array([-10,12])
x1,x2,x3 = (0,None),(0,None),(0,None)

res = linprog(c,A,b,Aeq,beq,bounds=[x1,x2,x3])
print(res)

关于scipy.optimize.linprog
详细信息

-

评论

评论
加载中...

leetcode_1_两数之和

题目描述

给定一个整数数组 $nums$ 和一个整数目标值 $target$,请你在该数组中找出 和为目标值 $target$ 的那 两个 整数,并返回它们的数组下标。

+ })(window)
加载中...

leetcode_1_两数之和

题目描述

给定一个整数数组 $nums$ 和一个整数目标值 $target$,请你在该数组中找出 和为目标值 $target$ 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

示例 1:

@@ -161,7 +161,7 @@

解析

定义两个指针i,j,
遍历数组求和,当其nums[i]+num[j]=target时,记录两个下标的值[i,j],最后返回这个数组。

-

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution {
public int[] twoSum(int[] nums, int target) {
int a[]=new int[2];
for(int i=0;i<nums.length;i++){
for(int j=i+1;j<nums.length;j++){
if(nums[i]+nums[j]==target){
a[0]=i;a[1]=j;
return a;
}
}
}
return a;
}
}

评论

评论
加载中...

leetcode_2_两数相加

题目描述

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

+ })(window)
加载中...

leetcode_2_两数相加

题目描述

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

示例 1:

@@ -179,7 +179,7 @@

解析 这步是收尾工作,判断当前位carry是否为0,是则last.next==null,否则last.next.val=carry
这里仅需判断carry而无需判断高位的情况,因为不存在高位为0的情况

-

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
/*
* @lc app=leetcode.cn id=2 lang=java
*
* [2] 两数相加
*/

// @lc code=start
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode addTwoNumbers(ListNode l1, ListNode l2) {
ListNode res=new ListNode(0);
int carry=0;
ListNode last=res;
while(l1!=null||l2!=null){
if(l1!=null&&l2!=null){
last.next=new ListNode(0);
last.next.val=(l1.val+l2.val+carry)%10;
carry=(l1.val+l2.val+carry)/10;
l1=l1.next;
l2=l2.next;
last=last.next;
}
else if(l2==null){
last.next=new ListNode(0);
last.next.val=(l1.val+carry)%10;
carry=(l1.val+carry)/10;
l1=l1.next;
last=last.next;
}
else if(l1==null){
last.next=new ListNode(0);
last.next.val=(l2.val+carry)%10;
carry=(l2.val+carry)/10;
l2=l2.next;
last=last.next;
}
if(l1==null&&l2==null){
if(carry==0){
last.next=null;
}
else if(carry!=0){
last.next=new ListNode(carry);
}
}

}
return res.next;
}


}
// @lc code=end

评论

评论
加载中...

Mermaid 语法

介绍

Mermaid是一种基于Javascript的绘图工具,使用类似于Markdown的语法,使用户可以方便快捷地通过代码创建图表。

+ })(window)
加载中...

Mermaid 语法

介绍

Mermaid是一种基于Javascript的绘图工具,使用类似于Markdown的语法,使用户可以方便快捷地通过代码创建图表。

语法

流程图

所有流程图均由节点、几何形状和、箭头或线组成

定义流程图的方向

  • LR——从左到右

    @@ -289,7 +289,7 @@


评论

评论
公告
This is my Blog
加载中...

leetcode_3_无重复字符的最长子串

题目描述

给定一个字符串 $s$ ,请你找出其中不含有重复字符的 最长子串 的长度。

+ })(window)
加载中...

leetcode_3_无重复字符的最长子串

题目描述

给定一个字符串 $s$ ,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

1
2
3
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

示例 2:

@@ -176,7 +176,7 @@

求取某个子串或者子序列最长最短等最值问题或者求某个目标值时
  • 该问题本身可以通过暴力求解
  • -


    评论

    评论
    公告
    This is my Blog
    加载中...

    OS_PV操作

    什么是PV操作

    PV操作就是荷兰语Passeren(通过),Vrijgeven(释放)的简称。对应的就是wait等待,signal释放操作。

    + })(window)
    加载中...

    OS_PV操作

    什么是PV操作

    PV操作就是荷兰语Passeren(通过),Vrijgeven(释放)的简称。对应的就是wait等待,signal释放操作。

    P操作就是,将进程从运行态转化为阻塞态,直到它被另一个进程唤醒

    V操作就是,将一个处于阻塞态的进程唤醒。

    P操作

    1
    2
    3
    4
    s=s-1
    if(s<0){
    P();
    }
    @@ -151,7 +151,7 @@

    V操

    抢占式优先级调度算法和非抢占式优先级调度算法

    抢占式优先级调度算法可以使当前正在执行的进程被更高优先级的进程所打断,并立即切换到新的进程。这种调度算法通常会导致频繁的上下文切换,但是可以保证高优先级进程的响应时间,从而提高系统的实时性能。

    而非抢占式优先级调度算法则不允许其他进程打断当前进程的执行,只有在当前进程自愿放弃CPU控制权时才会进行进程切换。这种调度算法相对稳定,但是可能会导致低优先级进程长时间等待,影响系统的响应速度和实时性能。

    即抢占式优先级调度算法进行V操作时,唤醒的进程为优先级最高的进程,而非抢占式优先级调度算法的V操作则无作为,继续执行当前进程,完成后再执行其他进程。

    -

    评论

    评论
    公告
    This is my Blog
    加载中...

    给markdown文档添加参考文献引用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ## Markdown 增加文献引用

    这边文章是介绍如何在 Markdown 中增加文献引用。[<sup>1</sup>](#refer-anchor-1)

    ## 参考

    <div id="refer-anchor-1"></div>

    - [1] [百度学术](http://xueshu.baidu.com/)

    <div id="refer-anchor-2"></div>

    - [2] [Wikipedia](https://en.wikipedia.org/wiki/Main_Page)
    + })(window)
    加载中...

    给markdown文档添加参考文献引用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ## Markdown 增加文献引用

    这边文章是介绍如何在 Markdown 中增加文献引用。[<sup>1</sup>](#refer-anchor-1)

    ## 参考

    <div id="refer-anchor-1"></div>

    - [1] [百度学术](http://xueshu.baidu.com/)

    <div id="refer-anchor-2"></div>

    - [2] [Wikipedia](https://en.wikipedia.org/wiki/Main_Page)

    Markdown 增加文献引用

    这边文章是介绍如何在 Markdown 中增加文献引用。1

    参考

    @@ -154,7 +154,7 @@

    参考
  • [2] Wikipedia
  • -


    评论

    评论
    公告
    This is my Blog
    加载中...

    给Git添加代理

    1
    2
    3
    4
    5
    6
    7
    8
    # git config --global 协议.proxy 协议://ip地址:端口号
    git config --global http.proxy http://127.0.0.1:7890
    git config --global https.proxy http://127.0.0.1:7890

    # 取消代理
    git config --global --unset http.proxy
    git config --global --unset https.proxy

    + })(window)
    加载中...

    给Git添加代理

    1
    2
    3
    4
    5
    6
    7
    8
    # git config --global 协议.proxy 协议://ip地址:端口号
    git config --global http.proxy http://127.0.0.1:7890
    git config --global https.proxy http://127.0.0.1:7890

    # 取消代理
    git config --global --unset http.proxy
    git config --global --unset https.proxy

    1
    2
    3
    4
    5
    6
    7
    #只对github.com
    git config --global http.https://github.com.proxy http://127.0.0.1:7890
    git config --global http.https://github.com.proxy socks5://127.0.0.1:7891

    #取消代理
    git config --global --unset http.https://github.com.proxy

    1
    2
    git config --global --get http.proxy
    git config --global --get https.proxy
    -

    评论
    公告
    This is my Blog

    评论
    公告
    This is my Blog
    加载中...

    数据库复习

    绪论

    1.1 GO

    数据:描述事物的符号记录。

    + })(window)
    加载中...

    数据库复习

    绪论

    1.1 GO

    数据:描述事物的符号记录。

    数据库:数据库是长期储存在计算机内、有组织的、可共享的大量数据的集合

    数据库管理系统:数据库管理系统是位于用户与操作系统之间的一层数据管理软件,它是一个大型复杂的软件系统,它主要用于科学地组织和存储数据、高效地获取和维护数据。


    评论

    评论
    avatar
    Jc Zhang
    Follow Me
    公告
    This is my Blog
    加载中...

    OS_课设

    配置VScode

      + })(window)
      加载中...

      OS_课设

      配置VScode

      • 安装C/C++扩展

      • 安装完成之后,直接在VsCode中按 ctrl+shift+p快捷键,选择C/C++编辑UI

        @@ -405,7 +405,7 @@

        实现

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        25
        26
        27
        28
        29
        30
        31
        32
        33
        34
        35
        36
        37
        38
        39
        40
        41
        42
        43
        44
        45
        46
        47
        48
        49
        50
        51
        52
        53
        54
        55
        56
        57
        58
        59
        60
        61
        62
        63
        64
        65
        66
        67
        68
        69
        70
        71
        72
        73
        74
        75
        76
        77
        78
        79
        80
        81
        82
        83
        84
        85
        86
        87
        88
        89
        90
        91
        92
        93
        94
        95
        96
        97
        98
        99
        100
        101
        102
        103
        104
        105
        106
        107
        108
        109
        110
        111
        112
        113
        114
        115
        116
        117
        118
        119
        120
        121
        122
        123
        124
        125
        126
        127
        128
        129
        130
        131
        132
        133
        134
        135
        136
        137
        138
        139
        140
        141
        142
        143
        144
        145
        146
        147
        148
        149
        150
        151
        152
        153
        154
        155
        156
        157
        158
        159
        160
        161
        162
        163
        164
        165
        166
        167
        168
        169
        170
        171
        172
        173
        174
        175
        176
        177
        178
        179
        180
        181
        182
        183
        184
        185
        186
        187
        188
        189
        190
        191
        192
        193
        194
        195
        196
        197
        198
        199
        200
        201
        202
        203
        204
        205
        206
        207
        208
        209
        210
        211
        212
        213
        214
        215
        216
        217
        218
        219
        220
        221
        222
        223
        224
        225
        226
        227
        228
        229
        230
        231
        232
        233
        234
        235
        236
        237
        238
        239
        240
        241
        242
        243
        244
        245
        246
        247
        248
        249
        250
        251
        252
        253
        254
        255
        256
        257
        258
        259
        260
        261
        262
        263
        264
        265
        266
        267
        268
        269
        270
        271
        272
        273
        274
        275
        276
        277
        278
        279
        280
        281
        282
        283
        284
        285
        286
        287
        288
        289
        290
        291
        292
        293
        294
        295
        296
        297
        298
        299
        300
        301
        302
        303
        304
        305
        306
        307
        308
        309
        310
        311
        312
        313
        314
        315
        316
        317
        318
        319
        320
        321
        322
        323
        324
        325
        326
        327
        328
        329
        330
        331
        332
        333
        334
        335
        336
        337
        338
        339
        340
        341
        342
        343
        344
        345
        346
        347
        348
        349
        350
        351
        352
        353
        354
        355
        356
        357
        358
        359
        360
        361
        362
        363
        364
        365
        366
        367
        368
        369
        370
        371
        372
        373
        374
        375
        376
        377
        378
        379
        380
        381
        382
        383
        384
        385
        386
        387
        388
        389
        390
        391
        392
        393
        394
        395
        396
        397
        398
        399
        400
        401
        402
        403
        404
        405
        406
        407
        408
        409
        410
        411
        412
        413
        414
        415
        416
        417
        418
        419
        420
        421
        422
        423
        424
        425
        426
        427
        428
        429
        430
        431
        432
        433
        434
        435
        436
        437
        438
        439
        440
        441
        442
        443
        444
        445
        446
        447
        448
        449
        450
        451
        452
        453
        454
        455
        456
        457
        458
        459
        460
        461
        462
        463
        464
        465
        466
        467
        468
        469
        470
        471
        472
        473
        474
        475
        476
        477
        478
        479
        480
        481
        482
        483
        484
        485
        486
        487
        488
        489
        490
        491
        492
        493
        494
        495
        496
        497
        498
        499
        500
        501
        502
        503
        504
        505
        506
        507
        508
        509
        510
        511
        512
        513
        514
        515
        516
        517
        518
        519
        520
        521
        522
        523
        524
        525
        526
        527
        528
        529
        530
        531
        532
        533
        534
        535
        536
        537
        538
        539
        540
        541
        542
        543
        544
        545
        546
        547
        548
        549
        550
        551
        552
        553
        554
        555
        556
        557
        558
        559
        560
        561
        562
        #include<bits/stdc++.h>
        using namespace std;

        string command;//用户指令

        vector<string> path_list;

        struct File{//定义文件信息
        string filename;
        int size;
        string content="";
        time_t time;
        };

        struct User{//定义用户信息
        string user_name;
        string pwd;
        };


        struct Dir{ //目录信息
        string dir_name;
        vector<struct File> file;
        vector<struct Dir> dir;
        };

        struct Dir_Node{//目录联系信息
        struct Dir dir;
        vector<struct Dir_Node*> child;
        struct Dir_Node *parent;
        };

        struct Thread_Open_File_Table{//进程打开文件列表
        struct File file;
        int permission; //1读,2写,3读写
        char* p;//读写指针
        int index;//系统索引号
        };

        struct Sys_Open_File_Table{//系统打开文件列表
        struct File file;
        int permission; //1读,2写,3读写
        char* p;//读写指针
        int index;//系统索引号
        int count;//引用计数
        };


        vector<struct User> MFD; //主目录





        void Welcome();
        void Command_Judge(string command); //判断指令
        void Create_User();//创建用户
        void Show_User(); //显示用户信息
        void Login_In(struct User u); //用户登录判定
        void Dir(); ////显示当前目录下的文件信息
        void Insert_Node_Dir();
        void Cd(string dir_name);
        void Cd_Rollback();
        void MkDir(string dir_name);
        void Os_Open(string filename);
        void Os_Read();
        void Os_Write();
        void Os_Create(string fileName);
        void Os_Close();
        void showU();
        void ShowFileInfo();

        struct Dir_Node *pDir_root=new Dir_Node;
        struct Dir_Node *pCurDir=pDir_root; //当前目录
        vector<struct Sys_Open_File_Table> SOFT; //系统打开文件表
        vector<struct Thread_Open_File_Table> TOFT;//进程打开文件表
        time_t now_time; //时间戳变量
        string Login_In_status="";//登录状态

        int main(){
        Welcome();
        pDir_root->dir.dir_name="root";
        pDir_root->parent=nullptr;
        path_list.push_back("root");
        while(1){
        now_time=time(NULL);//实时时间戳

        for(int i=0;i<path_list.size();i++){
        if(i==path_list.size()-1)
        cout<<path_list[i];
        else
        cout<<path_list[i]<<"/";
        }
        if(Login_In_status!="")
        cout<<"("<<Login_In_status<<")";
        cout<<": >>> ";

        cin>>command;
        Command_Judge(command);
        }
        }

        void Command_Judge(string command){
        if(command=="help"){
        cout<<"dir-----显示当前目录文件"<<endl;
        cout<<"mkdir-----新建目录"<<endl;
        cout<<"cd-----切换到指定目录"<<endl;
        cout<<"cd..-----回退一级目录"<<endl;
        cout<<"del-----删除文件"<<endl;
        cout<<"open-----打开文件"<<endl;
        cout<<"create-----新建文件"<<endl;
        cout<<"read-----读文件"<<endl;
        cout<<"write-----写文件"<<endl;
        cout<<"close-----关闭文件"<<endl;
        cout<<"create_user-----创建用户"<<endl;
        cout<<"login-----用户登录"<<endl;
        cout<<"showU-----显示用户信息"<<endl;
        cout<<"showF-----显示文件详细信息"<<endl;
        cout<<endl;
        }
        else if(command=="dir"){
        Dir();
        cout<<endl;
        }
        else if(command=="exit"){
        system("pause");
        }
        else if(command=="create_user"){

        Create_User();

        cout<<endl;
        }
        else if(command=="login"){
        struct User u;
        cout<<"输入用户名"<<endl;
        cin>>u.user_name;
        cout<<"输入密码"<<endl;
        cin>>u.pwd;
        Login_In(u);
        }
        else if(command=="cd"){
        string dir_name;
        cin>>dir_name;
        Cd(dir_name);

        }
        else if(command=="cd.."){
        Cd_Rollback();
        }
        else if(command=="mkdir"){
        cout<<"输入新建目录名"<<endl;
        string dir_name;
        cin>>dir_name;
        MkDir(dir_name);

        }
        else if(command=="create"){
        string fileName;
        cout<<"输入文件名"<<endl;
        cin>>fileName;
        while(fileName.find("/")!=std::string::npos){
        cout<<"文件名不能包含'/' !!!"<<endl;
        cout<<"输入文件名"<<endl;
        cin>>fileName;
        }
        while(fileName.find(".")==std::string::npos||fileName.find(".")==fileName.size()-1){
        cout<<"文件必须有后缀 !!!"<<endl;
        cout<<"输入文件名"<<endl;
        cin>>fileName;
        }

        Os_Create(fileName);
        }
        else if(command=="open"){

        cout<<"输入文件名"<<endl;
        string fileName;
        cin>>fileName;
        Os_Open(fileName);
        }
        else if(command=="write"){
        Os_Write();
        }
        else if(command=="read"){
        Os_Read();
        }
        else if(command=="showU"){
        showU();
        }
        else if(command=="showF"){
        ShowFileInfo();
        }
        else{
        cout<<"不是命令"<<endl;
        cout<<endl;
        }

        }




        void Login_In(struct User u){
        bool flag=false;
        for(int i=0;i<MFD.size();i++){
        if(MFD[i].user_name==u.user_name){
        if(MFD[i].pwd==u.pwd){
        cout<<"登录成功"<<endl;
        Login_In_status=u.user_name;//登录状态改变
        cout<<endl;
        flag=true;
        for(int i=0;i<pCurDir->child.size();i++){
        if(pCurDir->child[i]->dir.dir_name==u.user_name){
        pCurDir=pCurDir->child[i];
        path_list.push_back(u.user_name);
        break;
        }
        }
        break;
        }
        else{
        cout<<"密码错误"<<endl;
        cout<<endl;
        flag=true;
        break;
        }

        }
        }
        if(flag==false)
        cout<<"用户名不存在"<<endl;
        cout<<endl;
        }


        void Dir(){
        for(int i=0;i<pCurDir->child.size();i++){
        cout<<pCurDir->child[i]->dir.dir_name<<endl;
        }
        for(int i=0;i<pCurDir->dir.file.size();i++){
        cout<<pCurDir->dir.file[i].filename<<endl;
        }
        }

        void Insert_Node_Dir(struct Dir_Node *pcurDir, struct Dir newDir){

        struct Dir_Node *child_node=new Dir_Node;
        child_node->dir=newDir;
        child_node->parent=pcurDir;

        pcurDir->child.push_back(child_node);
        }
        void Insert_Node_File(struct Dir_Node *pcurDir, struct Dir newDir){

        struct Dir_Node *child_node=new Dir_Node;
        child_node->dir.file=newDir.file;
        child_node->parent=pcurDir;

        pcurDir->child.push_back(child_node);
        }

        void Create_User(){
        if(pCurDir->parent!=nullptr){
        cout<<"非根目录无法创建用户!!!"<<endl;
        return;
        }
        struct User u;
        cout<<"输入用户名"<<endl;
        cin>>u.user_name;
        cout<<"输入密码"<<endl;
        cin>>u.pwd;
        for(int i=0;i<MFD.size();i++){
        if(MFD[i].user_name==u.user_name){
        cout<<"用户名已存在"<<endl;
        cout<<endl;
        return;
        }
        }
        MFD.push_back(u);

        struct Dir_Node *dn=new Dir_Node;
        struct Dir d;
        d.dir_name=u.user_name;
        dn->dir=d;
        Insert_Node_Dir(pCurDir, dn->dir);
        cout<<"创建成功!"<<endl;
        }

        void Cd(string dir_name){
        if(pCurDir->parent==nullptr){//判断是否为根目录
        if(Login_In_status=="no"){//判断是否登录
        cout<<"请先登录"<<endl;
        cout<<endl;
        return;
        }
        else{
        if(Login_In_status==dir_name){//判断是否为当前用户
        for(int i=0;i<pCurDir->child.size();i++){
        if(pCurDir->child[i]->dir.dir_name==dir_name){
        pCurDir=pCurDir->child[i];
        path_list.push_back(dir_name);
        return;
        }
        }
        }
        }

        }

        bool flag=false;
        for(int i=0;i<pCurDir->child.size();i++){
        if(pCurDir->child[i]->dir.dir_name==dir_name){
        pCurDir=pCurDir->child[i];
        path_list.push_back(dir_name);
        flag=true;
        break;
        }
        }
        if(flag==false)
        cout<<"目录不存在"<<endl;
        cout<<endl;
        }

        void Cd_Rollback(){
        if(pCurDir->parent==nullptr)
        cout<<"已经到达最顶级目录!"<<endl;
        else{
        pCurDir=pCurDir->parent;
        path_list.pop_back();
        }
        }

        void MkDir(string dir_name){
        if(pCurDir->parent==nullptr){
        cout<<"根目录无法创建非用户目录!!!"<<endl;
        return;
        }
        for(int i=0;i<pCurDir->child.size();i++){
        if(pCurDir->child[i]->dir.dir_name==dir_name){
        cout<<"目录已存在"<<endl;
        cout<<endl;
        return;
        }
        }
        struct Dir_Node *dn=new Dir_Node;
        struct Dir d;
        d.dir_name=dir_name;
        dn->dir=d;
        Insert_Node_Dir(pCurDir, dn->dir);
        cout<<"创建成功"<<endl;
        }


        void Os_Open(string filename){
        int f=0;
        for(int i=0;i<pCurDir->dir.file.size();i++){
        if(pCurDir->dir.file[i].filename==filename){
        f=1;
        break;
        }
        }
        if(f==0){
        cout<<"文件不存在"<<endl;
        return;
        }

        struct Thread_Open_File_Table toft;
        struct Sys_Open_File_Table soft;
        bool flag=false;//标志系统打开文件表是否存在该文件
        cout<<"权限: 1:读 2.写 3.读写"<<endl;
        int s;
        cin>>s;//声明权限
        if(s==1)
        toft.permission=1;
        else if(s==2)
        toft.permission=2;
        else if(s==3)
        toft.permission=3;
        else{
        cout<<"输入错误"<<endl;
        cout<<endl;
        return;
        }
        //在系统打开表中寻找,根据文件名
        for(int i=0;i<SOFT.size();i++){
        if(SOFT[i].file.filename==filename){//存在则计数器加一,并复制到进程的打开文件表中
        soft.file.filename=filename;
        SOFT[i].count++;
        toft.file.filename=filename;
        toft.index=i; //系统打开文件表的编号作为进程打开文件表的索引
        TOFT.push_back(toft);
        flag=true;
        break;
        }
        }
        if(flag==false){//不存在则,加入到系统的打开文件表,并复制到进程的打开文件表中
        soft.file.filename=filename;
        soft.count=1;
        SOFT.push_back(soft);
        toft.file.filename=filename;
        toft.index=SOFT.size()-1;
        TOFT.push_back(toft);
        }
        cout<<"打开成功"<<endl;
        }

        void Os_Write(){
        string fileName;
        int flag=false;
        int flag2=false;
        cout<<"输入文件名"<<endl;
        cin>>fileName;
        for(int i=0;i<pCurDir->dir.file.size();i++){
        if(pCurDir->dir.file[i].filename==fileName){//寻找目录是否存在该文件名
        flag=true; //存在
        // 查找进程打开文件表是否存在
        for(int j=0;j<TOFT.size();j++){
        if(TOFT[j].file.filename==fileName){
        flag2=true; //存在
        if(TOFT[j].permission==2||TOFT[j].permission==3){//判断权限
        cout<<"输入内容"<<endl;
        string content;
        cin>>content;
        pCurDir->dir.file[i].content=content;
        pCurDir->dir.file[i].size=content.size();
        break;
        }
        else{
        cout<<"没有写权限"<<endl;
        return;
        }
        }
        }
        if(flag2==false){
        cout<<"文件未打开"<<endl;
        return;
        }
        }
        }
        if(flag==false){
        cout<<"当前目录不存在该文件";
        return;
        }
        cout<<"写入成功"<<endl;
        }

        void Os_Read(){
        bool flag=false;
        bool flag2=false;
        string fileName;
        cout<<"输入文件名"<<endl;
        cin>>fileName;
        for(int i=0;i<pCurDir->dir.file.size();i++){
        if(pCurDir->dir.file[i].filename==fileName){//判断当前目录是否存在该文件
        flag=true;
        for(int j=0;j<TOFT.size();j++){
        if(TOFT[j].file.filename==fileName){//判断进程打开文件表是否存在该文件
        flag2=true;
        if(TOFT[j].permission==1||TOFT[j].permission==3){//判断权限
        cout<<pCurDir->dir.file[i].content<<endl;
        break;
        }
        else{
        cout<<"没有读权限"<<endl;
        return;
        }
        }
        }
        if(flag2==false){
        cout<<"文件未打开"<<endl;
        return;
        }
        }
        }

        if(flag==false){
        cout<<"当前目录不存在该文件"<<endl;
        return;
        }
        }

        void Os_Del(string filename){
        int flag=false;
        for(int i=0;i<pCurDir->dir.file.size();i++){
        if(pCurDir->dir.file[i].filename==filename){
        flag=true;
        pCurDir->dir.file.erase(pCurDir->dir.file.begin()+i);
        break;
        }
        }
        if(flag==false){
        cout<<"当前目录不存在该文件"<<endl;
        return;
        }
        cout<<"删除成功"<<endl;
        }

        void Os_Create(string fileName){
        for(int i=0;i<pCurDir->dir.file.size();i++){
        if(pCurDir->dir.file[i].filename==fileName){
        cout<<"当前目录已存在该文件,无法继续创建"<<endl;
        return;
        }
        }
        struct File file;
        file.filename=fileName;
        file.size=file.content.size();
        file.time=now_time;
        pCurDir->dir.file.push_back(file);
        cout<<"创建成功"<<endl;
        }

        void Show_User(){
        for(int i=0;i<MFD.size();i++){
        cout<<MFD[i].user_name<<endl;
        }
        }

        void showU(){

        cout<<"-------------------------------------------------------------------"<<endl;
        cout<<"用户名"<<"\t"<<endl;
        for(int i=0;i<MFD.size();i++){
        cout<<MFD[i].user_name<<endl;
        }
        cout<<"-------------------------------------------------------------------"<<endl;

        }

        void Os_Close(){
        string filename;
        cout<<"输入文件名"<<endl;
        for(int i=0;i<TOFT.size();i++){
        if(TOFT[i].file.filename==filename){
        SOFT[TOFT[i].index].count--;
        if(SOFT[TOFT[i].index].count==0)
        SOFT.erase(SOFT.begin()+TOFT[i].index);
        TOFT.erase(TOFT.begin()+i);
        cout<<"关闭成功"<<endl;
        return;
        }
        }
        }

        void ShowFileInfo(){
        cout<<"-------------------------------------------------------------------"<<endl;
        cout.setf(ios::right);
        cout<<"文件名\t\t文件大小\t创建时间戳\n";
        for(int i=0;i<pCurDir->dir.file.size();i++){
        cout<<pCurDir->dir.file[i].filename<<"\t\t"<<pCurDir->dir.file[i].size<<"\t\t"<<pCurDir->dir.file[i].time<<endl;
        }
        cout.unsetf(ios::right);
        cout<<"-------------------------------------------------------------------"<<endl;
        }

        void Welcome(){
        cout<<"-------------------------------------------------------------------"<<endl;
        cout<<"欢迎使用文件系统"<<endl;
        cout<<"输入help以查看帮助"<<endl;
        cout<<"-------------------------------------------------------------------"<<endl;
        }
        -

      评论

    评论
    公告
    This is my Blog
    加载中...

    MSP430单片机课设

    我们组完成的项目是远程温度检测系统设计。

    + })(window)
    加载中...

    MSP430单片机课设

    我们组完成的项目是远程温度检测系统设计。

    要实现的东西

    课设要做温度监视并且通过串口发送到PC和阿里云。主要功能是通过ds18b20传感器获取温度信息传给单片机,然后单片机通过串口给pc发送温度信息,同时给esp8266发送指令将温度信息上传到阿里云。

    材料:

      @@ -448,7 +448,7 @@

      image-20230705003904473

      电路图

      image-20230705132215490

      An unforgettable journey!!!

      -


    评论

    评论
    公告
    This is my Blog
    加载中...

    KMP

    关键概念:


    评论
    公告
    This is my Blog
    加载中...

    常见算法模板

    快速排序

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    static void qsort(int[] a, int l,int r){
    if(l>=r)return;
    int i=l-1,j=r+1,x=a[l+r>>1];
    while(i<j){
    do i++; while(a[i]<x);
    do j--;while(x<a[j]);
    if(i<j){
    swap(a,i,j);
    }
    }
    qsort(a,l,j);
    qsort(a,j+1,r);
    }
    + })(window)
    加载中...

    常见算法模板

    快速排序

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    static void qsort(int[] a, int l,int r){
    if(l>=r)return;
    int i=l-1,j=r+1,x=a[l+r>>1];
    while(i<j){
    do i++; while(a[i]<x);
    do j--;while(x<a[j]);
    if(i<j){
    swap(a,i,j);
    }
    }
    qsort(a,l,j);
    qsort(a,j+1,r);
    }

    它的思想很简单,但是它的边界处理真的很傻x,稍不留神就会无限递归或无线循环。

    我曾如是写道:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    static void qsort(int[] arr, int begin, int end){
    if(begin>=end) return;
    int i=begin,j=end,x=arr[begin+end>>1];
    while(i<j){
    while(arr[i]<x) i++;
    while(x<arr[j]) j--;
    if(i<j) {
    swap(arr,i,j);
    }
    }
    qsort(arr,begin, i-1);
    qsort(arr, i+1,end);
    }
    @@ -159,7 +159,7 @@

    坑是真的多

    归并排序

    二分查找

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    class Solution {

    public int binary_search(int low, int high, int[] nums, int target){
    if(low>high) return -1;
    else{
    int mid = (low+high)/2;
    if(nums[mid]<target){
    return binary_search(mid+1, high, nums, target);
    }
    else if(nums[mid]>target){
    return binary_search(low, mid-1, nums, target);
    }
    else
    return mid;
    }

    }
    public int search(int[] nums, int target) {
    return binary_search(0, nums.length-1, nums, target);
    }
    }
    -

    评论

    评论
    公告
    This is my Blog
    加载中...

    蓝桥杯相关(待更)


    评论
    加载中...

    蓝桥杯相关(待更)


    评论
    加载中...

    SpringBoot

    maven

    本地仓库配置

    + })(window)
    加载中...

    SpringBoot

    maven

    本地仓库配置

    conf->settings.xml里设置本地仓库存储路径

    1
    <localRepository>/path/to/local/repo</localRepository>

    并在IDEA设置中设置其主目录路径,配置文件路径和仓库路径。

    @@ -501,7 +501,7 @@

    Mock.

    安装:

    1
    npm install mockjs

    image-20230715135128820

    -


    评论

    评论
    加载中...

    Java爬虫——Jsoup

    Jsoup介绍

    官网

    + })(window)
    加载中...

    Java爬虫——Jsoup

    Jsoup介绍

    官网

    下载和使用

    下载jar包

    通过添加Libraries的方式引入:

    1、首先在根目录下创建一个 libs 的目录

    2、打开 File -> Project Structure

    3、单击 Libraries -> “+” -> “Java” -> 选择我们导入的项目主目录,点击OK

    -

    评论

    评论
    加载中...

    使用SpringBoot解决跨域请求

    问题

    当我用js的axios库向指定api发送请求获取数据时常常会遇到跨域请求问题

    + })(window)
    加载中...

    使用SpringBoot解决跨域请求

    问题

    当我用js的axios库向指定api发送请求获取数据时常常会遇到跨域请求问题

    1
    Access to XMLHttpRequest at 'https://www.**' from origin 'http://127.0.0.1:5501' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

    我尝试使用springboot代理此次请求。

    编写一个控制器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    @RestController
    public class proxy {

    @CrossOrigin
    @GetMapping("/get")
    public String getPic(String kwd){
    HttpHeaders headers = new HttpHeaders();
    RestTemplate restTemplate=new RestTemplate();

    String url1="https://www.baidu.com";
    Map<String, String>params=new HashMap<>();
    params.put("p","1");
    HttpEntity<Map<String, String>> entity = new HttpEntity<>(params, headers);
    String url="https://www.pixivs.cn/ajax/search/artworks/"+kwd;
    System.out.println(url);
    headers.add("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36");
    String res= restTemplate.exchange(url,HttpMethod.GET,entity ,String.class).getBody();
    System.out.println(res);
    return res;
    }
    }

    -

    评论
    公告
    This is my Blog
    目录

    评论
    公告
    This is my Blog
    目录
    加载中...

    防止谷歌重定向

    我用的是谷歌的 Chrome 浏览器,默认的 Google 搜索引擎,用的是 Google.com 的网址,可不知咋的,这两天所有的搜索结果都转到了 Google.com.hk 上去了。

    + })(window)
    加载中...

    防止谷歌重定向

    我用的是谷歌的 Chrome 浏览器,默认的 Google 搜索引擎,用的是 Google.com 的网址,可不知咋的,这两天所有的搜索结果都转到了 Google.com.hk 上去了。

    在 Google 首页及搜索设置中找了一圈,也没能把它改回为Google.com 的搜索结果。只好上网寻找解决办法,发现其实相当简单,不用其它类似文章写的那么复杂。

    原理:只要告诉 Google.com 不要进行区域重定向(No Country Redirection,简称NCR)。

    具体做法:在网址栏打入:

    1
    http://www.google.com/ncr

    然后回车即可。

    还没有改过来?哦,你忘了最重要的一步,即在完成上步操作后,立即重启 Google Chrome 浏览器。

    -

    评论
    公告
    This is my Blog

    评论
    公告
    This is my Blog
    加载中...

    大三-每日任务

    概要

    四级没过,内心受到沉重打击,且临近毕业,碌碌无为,一事无成。因此发奋图强,以一雪前耻,以求无怨无悔。

    + })(window)
    加载中...

    大三-每日任务

    概要

    四级没过,内心受到沉重打击,且临近毕业,碌碌无为,一事无成。因此发奋图强,以一雪前耻,以求无怨无悔。

    2023-08

    2023-08-29

    背单词

    @@ -191,7 +191,7 @@

    编译原理

    -

    评论

    评论
    公告
    This is my Blog
    加载中...

    Leetcode_27. 移除元素

    给你一个数组 $nums$ 和一个值 $val$,你需要 原地 移除所有数值等于 $val$ 的元素,并返回移除后数组的新长度。

    + })(window)
    加载中...

    Leetcode_27. 移除元素

    给你一个数组 $nums$ 和一个值 $val$,你需要 原地 移除所有数值等于 $val$ 的元素,并返回移除后数组的新长度。

    不要使用额外的数组空间,你必须仅使用 $O(1)$ 额外空间并 原地 修改输入数组

    元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

    说明:

    @@ -162,7 +162,7 @@
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    class Solution {
    public int removeElement(int[] nums, int val) {
    int idx=0;
    for(int i=0;i<nums.length;i++){
    if(nums[i]!=val){
    nums[idx++]=nums[i];
    }
    }
    return idx;
    }
    }

    这种类似的思路在283中也运用了。

    -

    评论
    公告
    This is my Blog

    评论
    公告
    This is my Blog
    加载中...

    Leetcode_283. 移动零

    给定一个数组 $nums$,编写一个函数将所有 $0$ 移动到数组的末尾,同时保持非零元素的相对顺序。

    + })(window)
    加载中...

    Leetcode_283. 移动零

    给定一个数组 $nums$,编写一个函数将所有 $0$ 移动到数组的末尾,同时保持非零元素的相对顺序。

    请注意 ,必须在不复制数组的情况下原地对数组进行操作。

    示例 1:

    1
    2
    输入: nums = [0,1,0,3,12]
    输出: [1,3,12,0,0]
    @@ -158,7 +158,7 @@

    第二次迭代

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class Solution {
    public void moveZeroes(int[] nums) {
    int idx=0;
    for(int i=0;i<nums.length;i++){
    if(nums[i]!=0){
    nums[idx++]=nums[i];
    }
    }
    for(int i=idx;i<nums.length;i++){
    nums[i]=0;
    }
    }
    }

    双指针:

    -

    评论
    公告
    This is my Blog

    评论
    公告
    This is my Blog
    加载中...

    Leetcode_485. 最大连续 1 的个数

    485. 最大连续 1 的个数

    + })(window)
    加载中...

    Leetcode_485. 最大连续 1 的个数

    485. 最大连续 1 的个数

    给定一个二进制数组 $nums$ , 计算其中最大连续 $1$ 的个数。

    示例 1:

    1
    2
    3
    输入:nums = [1,1,0,1,1,1]
    输出:3
    解释:开头的两位和最后的三位都是连续 1 ,所以最大连续 1 的个数是 3.
    @@ -157,7 +157,7 @@

    这里我遇到了一个问题,就是内循环的条件i<nums.length&&nums[i++]==1当我交换位置时,就会报数组越界的错误,我知道原因是因为i++的自增导致后面i<num.length的判断失误,但是当我改成nums[i++]==1&&i-1<nums.length还是会错。。。

    直接写一个debug程序追踪一下这些变量打断点逐步观察这些变量,发现nums[i++]会越界。

    结论就是条件表达式是自左而右依次进行的,第一个条件表达式的相关变量会影响后续表达式的值,对于&&,第一个表达式为false则后续条件表达式不会执行,这也正是题解所写那样写不会越界的原因。

    -

    评论
    公告
    This is my Blog

    评论
    公告
    This is my Blog
    加载中...

    Leetcode_203. 移除链表元素

    给你一个链表的头节点 $head$ 和一个整数 $val$ ,请你删除链表中所有满足 $Node.val == val$ 的节点,并返回 新的头节点

    + })(window)
    加载中...

    Leetcode_203. 移除链表元素

    给你一个链表的头节点 $head$ 和一个整数 $val$ ,请你删除链表中所有满足 $Node.val == val$ 的节点,并返回 新的头节点

    示例 1:


    1
    2
    输入:head = [1,2,6,3,4,5,6], val = 6
    输出:[1,2,3,4,5]

    示例 2:

    @@ -164,7 +164,7 @@

    使用c++

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    /**
    * 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* removeElements(ListNode* head, int val) {
    ListNode* dummy = new ListNode();
    dummy->next=head;
    ListNode* cur = head;
    ListNode* t = dummy;
    while(cur!=NULL){
    if(cur->val==val){
    t->next=cur->next;
    }
    else{
    t->next=cur;
    t=t->next;
    }
    cur=cur->next;
    }
    return dummy->next;
    }
    };

    这种方法使用了三个指针,dummy负责建立一个空头节点,cur负责遍历原链表,t负责随着cur的遍历而移动以建立新链表。这种方法是自然而然想到的。

    还有一种方法,使用两个指针就可以,把t优化掉:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    /**
    * 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* removeElements(ListNode* head, int val) {
    ListNode* dummy = new ListNode();
    dummy->next=head;
    ListNode* cur=dummy;
    while(cur->next!=NULL){
    if(cur->next->val==val){
    cur->next=cur->next->next;
    }
    else{
    cur=cur->next;
    }
    }
    return dummy->next;
    }
    };

    为什么使用cur->next而不是cur?

    我的理解是使用cur->next可以使cur节点在遍历的一开始可以有选择地回避一些不符合要求地节点,cur的作用是在遍历的同时穿起一个符合要求的链表。而dummy起到一个记录起点的作用。也是因为无法无脑落地的原因,所以使用它的dummy.next

    -

    评论
    公告
    This is my Blog

    评论
    公告
    This is my Blog
    加载中...

    Leetcode_206. 反转链表

    给你单链表的头节点 $head$ ,请你反转链表,并返回反转后的链表。

    + })(window)
    加载中...

    Leetcode_206. 反转链表

    给你单链表的头节点 $head$ ,请你反转链表,并返回反转后的链表。

    示例 1:


    1
    2
    输入:head = [1,2,3,4,5]
    输出:[5,4,3,2,1]

    示例 2:

    @@ -158,7 +158,7 @@

    进阶:链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    /**
    * Definition for singly-linked list.
    * public class ListNode {
    * int val;
    * ListNode next;
    * ListNode() {}
    * ListNode(int val) { this.val = val; }
    * ListNode(int val, ListNode next) { this.val = val; this.next = next; }
    * }
    */
    class Solution {
    public ListNode reverseList(ListNode head) {
    ListNode pre = null;
    ListNode p = head;
    while(p!=null){
    ListNode next = p.next;
    p.next=pre;
    pre=p;
    p=next;
    }
    return pre;
    }
    }

    这个我一开始没做出来,看了题解才会,呜呜呜。

    -

    评论
    公告
    This is my Blog

    评论
    公告
    This is my Blog
    加载中...

    leetcode_20. 有效的括号

    给定一个只包括 (){}[] 的字符串 $s$ ,判断字符串是否有效。

    + })(window)
    加载中...

    leetcode_20. 有效的括号

    给定一个只包括 (){}[] 的字符串 $s$ ,判断字符串是否有效。

    有效字符串需满足:

    1. 左括号必须用相同类型的右括号闭合。
    2. @@ -168,7 +168,7 @@
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      class Solution {
      public boolean isValid(String s) {
      Stack<Character> stack = new Stack<>();
      for(char character:s.toCharArray()){
      if(stack.isEmpty()){
      stack.push(character);
      }
      else if(stack.peek()=='('&&character==')'){
      stack.pop();
      }
      else if(stack.peek()=='{'&&character=='}'){
      stack.pop();
      }
      else if(stack.peek()=='['&&character==']'){
      stack.pop();
      }
      else if(character=='}'||character==')'||character==']'){
      return false;
      }
      else{
      stack.push(character);
      }
      }
      if(stack.size()==0){
      return true;
      }
      else{
      return false;
      }
      }
      }

      充分运用了if-else if的特性,随之而来的是代码可读性的下降,时空效率超过了50%玩家,满足了。。。

      也就是说hashmap的取效率比if判断低,这个也是可以理解的,两者都是常数级$O(1)$的时间复杂度,但是hashmap是要计算hash值的,哈希冲突太多会退化到$O(N)$,而if判断只是简单的比较。

      -

    评论
    公告
    This is my Blog

    评论
    公告
    This is my Blog
    加载中...

    leetcode_496. 下一个更大元素 I

    $nums1$ 中数字 $x$ 的 下一个更大元素 是指 $x$ 在 $nums2$ 中对应位置 右侧第一个 比 $x$ 大的元素。

    + })(window)
    加载中...

    leetcode_496. 下一个更大元素 I

    $nums1$ 中数字 $x$ 的 下一个更大元素 是指 $x$ 在 $nums2$ 中对应位置 右侧第一个 比 $x$ 大的元素。

    给你两个 没有重复元素 的数组 $nums1$ 和 $nums2$ ,下标从 0 开始计数,其中$nums1$ 是 $nums2$ 的子集。

    对于每个 $0 <= i < nums1.length$ ,找出满足 $nums1[i] == nums2[j]$ 的下标 $j$ ,并且在 $nums2$ 确定 $nums2[j]$ 的 下一个更大元素 。如果不存在下一个更大元素,那么本次查询的答案是 $-1$ 。

    返回一个长度为 $nums1.length$ 的数组 $ans$ 作为答案,满足 $ans[i]$ 是如上所述的 下一个更大元素

    @@ -210,7 +210,7 @@

    结论直接写代码好吧:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    class Solution {
    public int[] nextGreaterElement(int[] nums1, int[] nums2) {
    Stack<Integer> stack =new Stack<>();
    Map<Integer,Integer> map=new HashMap<>();
    for(int i=0;i<nums2.length;i++){
    if(stack.isEmpty()||stack.peek()>nums2[i]){
    stack.add(nums2[i]);
    }
    else{
    while(!stack.isEmpty()){
    int num = stack.peek();
    if(num<nums2[i]){
    map.put(stack.pop(),nums2[i]);
    }
    if(num>nums2[i]||stack.isEmpty()){
    stack.add(nums2[i]);
    break;
    }
    }
    }
    }
    int[] answers = new int[nums1.length];
    for(int i=0;i<nums1.length;i++){
    answers[i]=map.getOrDefault(nums1[i],-1);
    }
    return answers;
    }
    }

    这段代码也是调试了一个小时才通好吧。

    -


    评论

    评论
    公告
    This is my Blog
    加载中...

    Leetcode_933. 最近的请求次数

    写一个 $RecentCounter$ 类来计算特定时间范围内最近的请求。

    + })(window)
    加载中...

    Leetcode_933. 最近的请求次数

    写一个 $RecentCounter$ 类来计算特定时间范围内最近的请求。

    请你实现 $RecentCounter$ 类:

    • $RecentCounter()$ 初始化计数器,请求数为 0 。
    • @@ -160,7 +160,7 @@
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    class RecentCounter {
    Queue<Integer> queue = new LinkedList<>();
    public RecentCounter() {
    queue = new LinkedList<>();
    }

    public int ping(int t) {
    queue.add(t);
    while(t-queue.peek()>3000){
    queue.poll();
    }
    return queue.size();
    }
    }

    /**
    * Your RecentCounter object will be instantiated and called as such:
    * RecentCounter obj = new RecentCounter();
    * int param_1 = obj.ping(t);
    */

    题目第一次看,看不懂,后来看懂了,还是不会,看了讲解视频顿悟。因为ping t是递增的,所以过去3000ms的边界到队尾的元素肯定是<=3000ms的,我们只需要维护这段队列就可以了,ping请求发生时,我们让他入队,然后直接用当前时间减去队首,如果大于3000ms,就把队首元素出队,直到队首元素小于等于3000ms,然后返回队列的长度就可以了。

    -

    评论
    公告
    This is my Blog

    评论
    公告
    This is my Blog
    加载中...

    编译原理OJ

    A - 小C语言—词法分析程序

    + })(window)
    加载中...

    编译原理OJ

    A - 小C语言—词法分析程序

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    #include<bits/stdc++.h>
    using namespace std;
    string kind[5] = { "keyword","identifier","integer","boundary","operator" };
    string key[6] = { "main","if","else","for","while","int" };
    void Check(string token){
    if(token[0]>='0'&&token[0]<='9'){
    cout<<"("<<kind[2]<<","<<token<<")"<<endl;
    return;
    }
    else{
    for(int i=0;i<6;i++){
    if(token==key[i]){
    cout<<"("<<kind[0]<<","<<token<<")"<<endl;
    return;
    }
    }
    cout<<"("<<kind[1]<<","<<token<<")"<<endl;
    }
    }
    int main(){
    string str;
    while(cin>>str){
    string token="";
    int len = str.length();
    for(int i=0;i<len;i++){
    //遇到界符,往往表示单词结束,判断
    if(str[i]=='('||str[i] == ')'||str[i]=='{'||str[i]=='}'||str[i]==','||str[i]==';'){
    if(token.length()){
    Check(token);
    }
    cout<<"("<<kind[3]<<","<<str[i]<<")"<<endl;
    token="";
    }//遇到运算符,往往表示单词结束,判断是否为双目运算符,是则输出,否则单目运算符,输出单目运算符
    else if(str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/'||str[i]=='='||str[i]=='>'||str[i]=='<'||str[i]=='!'){
    if(token.length()){
    Check(token);
    }
    token="";
    if(i+1<len&&str[i+1]=='='){
    cout<<"("<<kind[4]<<","<<str[i]<<"="<<")"<<endl;
    i++;
    }
    else{
    cout<<"("<<kind[4]<<","<<str[i]<<")"<<endl;
    }
    }//该字符不是界符也不是运算符,加入token中
    else{
    token+=str[i];
    }

    }//每次循环结束,判断token是否为空,不为空则检查其类型
    if(token.length()){
    Check(token);
    }
    }
    }

    B - 识别浮点常量问题

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    #include<bits/stdc++.h>
    using namespace std;
    bool isNum(char c){
    if(c>='0'&&c<='9')
    return true;
    return false;
    }
    int findP(int l, int r, string s){
    for(int i=0;i<=r;i++){
    if(s[i]=='.'){
    return i;
    }
    }
    return -1;
    }
    int countP(int l, int r, string s){
    int cnt=0;
    for(int i=l;i<=r;i++){
    if(s[i]=='.'){
    cnt++;
    }
    }
    return cnt;
    }
    bool isSign(char c){
    if(c=='+'||c=='-')
    return true;
    return false;
    }
    bool isSmallNum(int l, int r, string s){
    int p_l=findP(l,r,s);
    int flag=0;
    //判断小数点个数
    if(!(countP(l,r,s)==1)){
    return false;
    }
    //判小数点左侧是否有数字
    for(int i=0;i<p_l;i++){
    if(isNum(s[i])){
    flag=1;
    break;
    }
    }
    if(!flag) return false;
    flag=0;
    //判小数点右侧是否有数字
    for(int i=p_l+1;i<=r;i++){
    if(isNum(s[i])){
    flag=1;
    break;
    }
    }
    if(!flag) return false;
    for(int i=l;i<=r;i++){
    if(i==l&&isSign(s[l])){
    if(r-l+1==1) return false;
    continue;
    }
    else if(s[i]=='.'){
    continue;
    }
    else if(isNum(s[i])){
    continue;
    }
    else{
    return false;
    }
    }
    return true;

    }

    int FindE(string s){
    for(int i=0;i<s.size();i++){
    if(s[i]=='e'||s[i]=='E'){
    return i;
    }
    }
    return -1;
    }
    bool isInt(int l, int r, string s){
    for(int i=l;i<=r;i++){
    if(i==l&&isSign(s[l])){
    if(r-l+1==1) return false;
    continue;
    }
    else if(isNum(s[i])){
    continue;
    }
    else{
    return false;;
    }
    }
    return true;
    }
    int main(){
    string s;
    int flag=0;
    getline(cin, s);
    int l=0, r=s.size()-1;
    while(s[l]==' ') l++;
    while(s[r]==' ') r--;
    int len=s.size();
    //3e-.3
    int res=FindE(s);
    if(res==-1){
    if(isSmallNum(l, r, s)){
    cout<<"YES";
    return 0;
    }
    else{

    cout<<"NO";
    return 0;
    }

    }
    else{
    if(res==l||res==r){
    flag=1;
    }
    if(!isSmallNum(l, res-1, s)&&!isInt(l,res-1,s)){
    flag=1;
    }
    if(isInt(res+1,r,s)){
    ;
    }
    else{
    flag=1;
    }
    if(flag==0){
    cout<<"YES";
    return 0;
    }
    else{
    cout<<"NO";
    return 0;
    }
    return 0;
    }


    }

    -

    评论
    公告
    This is my Blog

    评论
    公告
    This is my Blog
    加载中...

    无题

    Description
    给定含有$n$个元素的多重集合$S$,每个元素在$S$中出现的次数称为该元素的重数。多重集$S$中重数最大的元素称为众数。例如,$S={1,2,2,2,3,5}$。多重集S的众数是$2$,其重数为$3$。对于给定的由n 个自然数组成的多重集$S$,计算$S$的众数及其重数。如果出现多个众数,请输出最小的那个。

    + })(window)
    加载中...

    无题

    Description
    给定含有$n$个元素的多重集合$S$,每个元素在$S$中出现的次数称为该元素的重数。多重集$S$中重数最大的元素称为众数。例如,$S={1,2,2,2,3,5}$。多重集S的众数是$2$,其重数为$3$。对于给定的由n 个自然数组成的多重集$S$,计算$S$的众数及其重数。如果出现多个众数,请输出最小的那个。

    Input
    输入数据的第1行是多重集$S$中元素个数$n\ (n<1300000)$;接下来的n行中,每行有一个最多含有5位数字的自然数,。

    Output
    输出数据的第1行给出众数,第2行是重数。

    Samples
    Sample #1

    @@ -235,7 +235,7 @@

    ​ $T(n)=O(n^{log_b{a}}logn)=O(logn)$

    ​ 所以时间复杂度:$O(logN)$

    综上时间复杂度是$O(N)$

    -


    评论

    评论
    公告
    This is my Blog
    加载中...

    编译原理-习题

    基础

    DFA

    确定的有限自动机DFA M是一个五元组$M =(S,\sum,δ ,S_0 ,F )$

    + })(window)
    加载中...

    编译原理-习题

    基础

    DFA

    确定的有限自动机DFA M是一个五元组$M =(S,\sum,δ ,S_0 ,F )$

    (1) S 是一个非空有限集,它的每个元素称为一个状态。

    (2) $\sum$ 是一个有穷字母表,它的每个元素称为一个输入符号,所以也称为输入符号字母表。

    (3) δ是状态转换函数,是在$S×\sum→S$上的单值映射

    @@ -165,7 +165,7 @@


    评论

    评论
    avatar
    Jc Zhang
    Follow Me
    公告
    This is my Blog
    加载中...

    Linux常用命令


    评论
    公告
    This is my Blog
    加载中...

    leetcode_217. 存在重复元素

    题目描述

    给你一个整数数组 $nums$ 。如果任一值在数组中出现 至少两次 ,返回 $true$ ;如果数组中每个元素互不相同,返回 $false$ 。

    + })(window)
    加载中...

    leetcode_217. 存在重复元素

    题目描述

    给你一个整数数组 $nums$ 。如果任一值在数组中出现 至少两次 ,返回 $true$ ;如果数组中每个元素互不相同,返回 $false$ 。

    示例 1:

    1
    2
    输入:nums = [1,2,3,1]
    输出:true

    示例 2:

    @@ -157,7 +157,7 @@
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    // class Solution {
    // public boolean containsDuplicate(int[] nums) {
    // Map<Integer,Integer> map = new HashMap<>();
    // for(int i=0;i<nums.length;i++){
    // if(map.containsKey(nums[i])){
    // return true;
    // }
    // map.put(nums[i],1);
    // }
    // return false;
    // }
    // }

    class Solution {
    public boolean containsDuplicate(int[] nums) {
    Set<Integer> set = new HashSet<>();
    for(int i=0;i<nums.length;i++){
    if(set.contains(nums[i])){
    return true;
    }
    set.add(nums[i]);
    }
    return false;
    }
    }

    注意

    HashSet 基于 HashMap 来实现的,是一个不允许有重复元素的集合。插入和搜索时间复杂度为 $O(1)$

    -

    评论

    评论
    公告
    This is my Blog
    加载中...

    leetcode_389. 找不同

    题目描述

    给定两个字符串 $s$ 和 $t$ ,它们只包含小写字母。

    + })(window)
    加载中...

    leetcode_389. 找不同

    题目描述

    给定两个字符串 $s$ 和 $t$ ,它们只包含小写字母。

    字符串 $t$ 由字符串 $s$ 随机重排,然后在随机位置添加一个字母。

    请找出在 $t$ 中被添加的字母。

    示例 1:

    @@ -163,7 +163,7 @@

    实现

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class Solution {
    public char findTheDifference(String s, String t) {
    char sum=0;
    for(int i=0;i<t.length();i++){
    sum+=t.charAt(i);
    }
    for(int i=0;i<s.length();i++){
    sum-=s.charAt(i);
    }
    return sum;
    }
    }

    方法三:异或

    思路

    依次遍历st,将st中每个字符进行异或,最后返回异或的结果。
    因为两个相同的字符异或操作的结果是0,所以最后剩下的字符就是t中多出来的字符。

    实现

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class Solution {
    public char findTheDifference(String s, String t) {
    char sum=0;
    for(int i=0;i<t.length();i++){
    sum^=t.charAt(i);
    }
    for(int i=0;i<s.length();i++){
    sum^=s.charAt(i);
    }
    return sum;
    }
    }
    -

    评论

    评论
    公告
    This is my Blog
    加载中...

    Leetcode_705. 设计哈希集合

    不使用任何内建的哈希表库设计一个哈希集合(HashSet)。

    + })(window)
    加载中...

    Leetcode_705. 设计哈希集合

    不使用任何内建的哈希表库设计一个哈希集合(HashSet)。

    实现 $MyHashSet$ 类:

    • $void add(key)$ 向哈希集合中插入值 $key$ 。
    • @@ -159,7 +159,7 @@

    方法一:链地址法

    描述

    哈希表长度最好为素数,这样可以减少哈希冲突,这里取857,然后使用链地址法解决哈希冲突,即使用链表存储哈希冲突的元素。

    实现

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    class MyHashSet {
    private final int BASE=857;
    private LinkedList[] data;
    public MyHashSet() {
    data = new LinkedList[BASE];
    for(int i=0; i<BASE; i++){
    data[i]=new LinkedList<Integer>();
    }
    }

    public void add(int key) {
    int loc = hash(key);
    Iterator<Integer> iterator = data[loc].iterator();
    while(iterator.hasNext()){
    Integer element = iterator.next();
    if(element==key){
    return;
    }
    }
    data[loc].offerLast(key);
    }

    public void remove(int key) {
    int loc = hash(key);
    Iterator<Integer> iterator = data[loc].iterator();
    while(iterator.hasNext()){
    Integer element = iterator.next();
    if(element==key){
    data[loc].remove(element);
    return;
    }
    }
    }

    public boolean contains(int key) {
    int loc = hash(key);
    Iterator<Integer> iterator = data[loc].iterator();
    while(iterator.hasNext()){
    Integer element = iterator.next();
    if(element==key){
    return true;
    }
    }
    return false;
    }
    public int hash(int key){
    return key%BASE;
    }
    }
    -

    评论

    评论
    公告
    This is my Blog
    加载中...

    堆的java实现

    存储结构

    堆是一种具有特殊规则的树,而且是完全二叉树,存储完全二叉树,常见的方式就是数组。

    + })(window)
    加载中...

    堆的java实现

    存储结构

    堆是一种具有特殊规则的树,而且是完全二叉树,存储完全二叉树,常见的方式就是数组。

    • 左孩子与父节点在数组索引的关系
      $i{parent}=(i{left}-1)/2$
    • 右孩子与父节点在数组索引的关系
      $i{parent}=(i{right}-2)/2$

      @@ -200,7 +200,7 @@

      实现

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      public MaxHeap(int[] arr){
      data = new ArrayList<>();
      for(int i:arr){
      data.add(i);
      }
      int lastParent = getParent(data.size()-1);
      for (int i=lastParent;i>=0;i--){
      siftDown(i);
      }
      }

      练习

      数组中的第K个最大元素

      一运行超过16%的用户破防了

      -

    评论

    评论
    公告
    This is my Blog
    加载中...

    leetcode_215. 数组中的第K个最大元素

    题目

    给定整数数组 $nums$ 和整数 $k$,请返回数组中第 $k$ 个最大的元素。

    + })(window)
    加载中...

    leetcode_215. 数组中的第K个最大元素

    题目

    给定整数数组 $nums$ 和整数 $k$,请返回数组中第 $k$ 个最大的元素。

    请注意,你需要找的是数组排序后的第 $k$ 个最大的元素,而不是第 $k$ 个不同的元素。

    你必须设计并实现时间复杂度为 $O(n)$ 的算法解决此问题。

    示例 1:

    @@ -156,7 +156,7 @@
  • $-10^{4} <= nums[i] <= 10^{4}$
  • 解析

    堆的java实现

    -

    实现

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    class Solution {
    public class MaxHeap{
    private int size;
    private ArrayList<Integer> data;
    public MaxHeap(){
    data = new ArrayList<>();
    }
    public MaxHeap(int[] arr){
    data = new ArrayList<>();
    for(int i=0;i<arr.length;i++){
    data.add(arr[i]);
    }
    int lastP = getParent(data.size()-1);
    for(int i=lastP;i>=0;i--){
    siftDown(i);
    }
    }
    public int size(){
    return this.data.size();
    }
    public boolean isEmpty(){
    return this.data.isEmpty();
    }
    public int getParent(int idx){
    return (idx-1)/2;
    }
    public int getLeftChild(int idx){
    return idx*2+1;
    }
    public int getRightChild(int idx){
    return idx*2+2;
    }
    public void swap(int i,int j){
    Integer temp = data.get(i);
    data.set(i,data.get(j));
    data.set(j,temp);
    }
    public void siftUp(int k){
    while(k>0&&data.get(getParent(k))<data.get(k)){
    swap(k,getParent(k));
    k = getParent(k);
    }
    }
    public void siftDown(int k){
    while(getLeftChild(k)<data.size()){
    int j = getLeftChild(k);
    if(getRightChild(k)<data.size()){
    if(data.get(j)<data.get(getRightChild(k))){
    j = getRightChild(k);
    }
    }
    if(data.get(j)>data.get(k)){
    swap(j,k);
    k = j;
    }
    else{
    break;
    }
    }
    }
    public Integer poll(){
    Integer res = data.get(0);
    data.set(0,data.get(data.size()-1));
    data.remove(data.size()-1);
    siftDown(0);
    return res;
    }
    public Integer peek(){
    return data.get(0);
    }
    public void add(Integer element){
    data.add(element);
    siftUp(data.size()-1);
    }
    }
    public int findKthLargest(int[] nums, int k) {
    MaxHeap heap = new MaxHeap(nums);
    for(int i=0;i<k-1;i++){
    heap.poll();
    }
    return heap.peek();
    }
    }

    评论

    评论
    公告
    This is my Blog
    加载中...

    内网穿透的实现

    什么是内网穿透


    评论
    公告
    This is my Blog
    加载中...

    感想

    我感觉写博客是一件费时费力且无太大意义的事,我写的这些东西,互联网上可以轻易地检索到,感觉我在做无用功,只剩下纪念意义。

    -

    评论
    公告
    This is my Blog
    加载中...

    感想

    我感觉写博客是一件费时费力且无太大意义的事,我写的这些东西,互联网上可以轻易地检索到,感觉我在做无用功,只剩下纪念意义。

    +

    评论
    公告
    This is my Blog
    加载中...

    leetcode_206. 反转链表

    给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

    + })(window)
    加载中...

    leetcode_206. 反转链表

    给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

    示例 1:

    @@ -164,7 +164,7 @@
  • -5000 &lt;= Node.val &lt;= 5000
  • 进阶:链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    /**
    * 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* reverseList(ListNode* head) {
    ListNode* dummy=new ListNode();
    ListNode* p=head;
    while(p!=NULL){
    ListNode* t=p;
    p=p->next;
    t->next=dummy->next;
    dummy->next=t;
    }
    return dummy->next;
    }
    };

    -

    评论
    公告
    This is my Blog

    评论
    公告
    This is my Blog
    加载中...

    leetcode_142. 环形链表 II

    142. 环形链表 II

    给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null

    + })(window)
    加载中...

    leetcode_142. 环形链表 II

    142. 环形链表 II

    给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null

    如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos-1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。

    不允许修改 链表。

    示例 1:

    @@ -241,7 +241,7 @@

    其中$(n-1)(b+c)$是周长的整数倍,因此位移是$0$

    因此$X_{slowP}=X_P=a$,即相遇于入环点。

    实现

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    /**
    * Definition for singly-linked list.
    * struct ListNode {
    * int val;
    * ListNode *next;
    * ListNode(int x) : val(x), next(NULL) {}
    * };
    */
    class Solution {
    public:
    ListNode *detectCycle(ListNode *head) {
    ListNode* pSlow=head;
    ListNode* pFast=head;
    // 相遇
    if(head==NULL) return NULL;
    do {
    pFast=(pFast==NULL||pFast->next==NULL)? NULL:pFast->next->next;
    pSlow=pSlow->next;
    } while(pSlow!=pFast);
    if(pSlow==NULL) return NULL;
    // 入环点
    ListNode* p=head;
    while(p!=pSlow){
    pSlow=pSlow->next;
    p=p->next;
    }
    return p;
    }
    };
    -


    评论

    评论
    加载中...

    Java集合


    评论
    公告
    This is my Blog
    加载中...

    Java集合


    评论
    公告
    This is my Blog
    加载中...

    Leetcode_96. 不同的二叉搜索树

    96. 不同的二叉搜索树

    给你一个整数 n ,求恰由 n 个节点组成且节点值从 1n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。

    + })(window)
    加载中...

    Leetcode_96. 不同的二叉搜索树

    96. 不同的二叉搜索树

    给你一个整数 n ,求恰由 n 个节点组成且节点值从 1n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。

    示例 1:


    1
    2
    **输入:**n = 3
    **输出:**5

    示例 2:

    @@ -159,7 +159,7 @@

    解析定义

    dp[i]表示n个节点组成且节点值从1n互不相同的 二叉搜索树 的个数。

    初始化

    1
    2
    dp[1]=1;
    dp[2]=2;

    递推方程

    实现

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    class Solution {
    public int numTrees(int n) {
    //定义dp[i]->由 i 个节点组成的二叉搜索树 有多少种
    //init
    int[] dp=new int [n+1];
    dp[0]=1;
    dp[1]=1;
    for(int i=2;i<=n;i++){
    for(int j=1;j<=i;j++){
    dp[i]+=dp[j-1]*dp[i-j];
    }
    }
    return dp[n];
    }
    }

    评论

    实现

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    class Solution {
    public int numTrees(int n) {
    //定义dp[i]->由 i 个节点组成的二叉搜索树 有多少种
    //init
    int[] dp=new int [n+1];
    dp[0]=1;
    dp[1]=1;
    for(int i=2;i<=n;i++){
    for(int j=1;j<=i;j++){
    dp[i]+=dp[j-1]*dp[i-j];
    }
    }
    return dp[n];
    }
    }

    评论
    加载中...

    为什么String是线程安全的?

    人们都说String是线程安全的,为什么呢?
    今日探究一下。

    +

    线程安全

    定义
    维基百科中,线程安全如下定义

    +
    +

    线程安全是程序设计中的术语,指某个函数、函数库在多线程环境中被调用时,能够正确地处理多个线程之间的公用变量,使程序功能正确完成。

    +
    +

    线程安全就是多个线程访问同一资源,线程间依照某种方式访问资源时,访问的结果总是能获取到正确的结果,运行得到正确得结果。
    线程安全的关键是正确的访问共享变量。

    +

    评论
    公告
    This is my Blog
    + + \ No newline at end of file diff --git a/about/index.html b/about/index.html index 508df5e7..d84ed01a 100644 --- a/about/index.html +++ b/about/index.html @@ -139,16 +139,16 @@ } } detectApple() - })(window)
    加载中...

    评论
    公告
    This is my Blog
    + })(window)
    加载中...