惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Spread Privacy
Spread Privacy
P
Palo Alto Networks Blog
P
Proofpoint News Feed
AI
AI
Help Net Security
Help Net Security
S
Securelist
T
Troy Hunt's Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
C
Cisco Blogs
Scott Helme
Scott Helme
Hacker News - Newest:
Hacker News - Newest: "LLM"
Vercel News
Vercel News
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
B
Blog
GbyAI
GbyAI
Recent Commits to openclaw:main
Recent Commits to openclaw:main
D
Darknet – Hacking Tools, Hacker News & Cyber Security
P
Proofpoint News Feed
S
Security Affairs
Cisco Talos Blog
Cisco Talos Blog
AWS News Blog
AWS News Blog
T
Tenable Blog
H
Help Net Security
NISL@THU
NISL@THU
F
Fortinet All Blogs
博客园_首页
G
GRAHAM CLULEY
L
LINUX DO - 最新话题
P
Privacy International News Feed
G
Google Developers Blog
博客园 - Franky
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Security Archives - TechRepublic
Security Archives - TechRepublic
The Register - Security
The Register - Security
L
LangChain Blog
aimingoo的专栏
aimingoo的专栏
T
Tor Project blog
P
Privacy & Cybersecurity Law Blog
量子位
C
Cyber Attacks, Cyber Crime and Cyber Security
Forbes - Security
Forbes - Security
S
Secure Thoughts
Simon Willison's Weblog
Simon Willison's Weblog
D
Docker
Recorded Future
Recorded Future
博客园 - 三生石上(FineUI控件)
L
Lohrmann on Cybersecurity
T
Tailwind CSS Blog

f2h2h1's blog

使用yii3实现一个微框架 claw养殖技术 计算机网络基础知识 定时任务 ACME的使用经验 magento2加上varnish缓存 开发Magento2的模块 在magento2中使用persisted-query socket编程 一些开发笔记 一段CSDN文章主要内容的油猴脚本 电子邮件的不完整总结 git的笔记 在Windows下配置PHP服务器 终端,控制台和外壳 PHP各种运行方式的不完整总结 把网页导出成PDF 和颜色相关的笔记 HTTP认证方式的不完整总结 SEO的经验 密码学入门简明指南 文件的上传和下载 用纯CSS3实现的滑动按钮 在VSCode里调试PHP Linux的GUI 关于字符编码的一些坑 nc的使用和原理 在Windows下安装Magento2 对JS原型链的理解 使用docker-compose部署magento2 浏览器和服务器通讯方式的不完整总结 观察网站性能 一些关于Linux的笔记 telnet的不完整总结 在Windows下安装pear MySQL的时间类型和时间相关的函数 Windows下通过PEB读取进程的环境变量 关于 在VSCode里使用Xdebug远程调试PHP 在Windows下搭建git服务 关于环境变量的不完整总结 使用shell实现的kv数据库 如何完成以xx管理系统为选题的毕业设计 数字号码资源 各种标记语言 使用PowerShell实现的http服务器 kind相关经验 DNSSEC简介 nginx+ffmpeg+websocket实现的直播例子 使用Tesseract识别字符验证码 使用docker部署nuxt FirstData后台的设置 paypal,firtdata,支付宝的不完整接入指南 微信支付的不完整接入指南 用docker-compose部署lnmp环境 mongodb分片
练习
2020-01-05 · via f2h2h1's blog

练习

这篇文章最后更新的时间在六个月之前,文章所叙述的内容可能已经失效,请谨慎参考!

leetcode

简单

67. 二进制求和

给定两个二进制字符串,返回他们的和(用二进制表示)。

输入为非空字符串且只包含数字 1 和 0。

示例 1:

输入: a = "11", b = "1"
输出: "100"

示例 2:

输入: a = "1010", b = "1011"
输出: "10101"

C

// c 反转字符串
void reverse(char* s, int len)
{
    // 交换 ...
    int i = 0;
    char c;
    while (i <= len / 2 - 1)
    {
        c = *(s + i);
        *(s + i) = *(s + len - 1 - i);
        *(s + len - 1 - i) = c;
        i++;
    }
}
char * addBinary(char * a, char * b){
    int al = strlen(a);
    int bl = strlen(b);
    int l;
    l = al > bl ? al : bl;
    l = l + 2; // 进一位 字符串结尾的 \0
    reverse(a, al);
    reverse(b, bl);

    char* ret;
    ret = (char*)malloc(l*sizeof(char));
    memset(ret, '0', l*sizeof(char));

    char temp, at, bt;
    temp = '0';
    for (int i = 0; i < l; i++) {
        at = a[i];
        if (i >= al || a[i] == '\0') {
            at = '0';
        }
        bt = b[i];
        if (i >= bl || b[i] == '\0') {
            bt = '0';
        }
        if (temp == '1' && at == '1' && bt == '1') {
            temp = '1';
            ret[i] = '1';
        } else if (temp == '0' && at == '1' && bt == '1') {
            temp = '1';
            ret[i] = '0';
        } else if (temp == '1' && at == '1' && bt == '0') {
            temp = '1';
            ret[i] = '0';
        } else if (temp == '0' && at == '1' && bt == '0') {
            temp = '0';
            ret[i] = '1';
        } else if (temp == '1' && at == '0' && bt == '1') {
            temp = '1';
            ret[i] = '0';
        } else if (temp == '0' && at == '0' && bt == '1') {
            temp = '0';
            ret[i] = '1';
        } else if (temp == '1' && at == '0' && bt == '0') {
            temp = '0';
            ret[i] = '1';
        } else if (temp == '0' && at == '0' && bt == '0') {
            temp = '0';
            ret[i] = '0';
        }
    }
    if (ret[l-2] == '0') {
        l = l - 1;
    }
    ret[l-1]='\0';
    reverse(ret, l - 1);
    return ret;
}

PHP

class Solution {
    /**
     * @param String $a
     * @param String $b
     * @return String
     */
    function addBinary($a, $b) {
        $a = strrev($a);
        $b = strrev($b);
        $temp = '0';
        $al = strlen($a);
        $bl = strlen($b);
        $len = max($al, $bl) + 1;
        $ret = [];
        for ($i = 0; $i < $len; $i++) {
            if ($i >= $al) {
                $at = '0';
            } else {
                $at = $a[$i];
            }
            if ($i >= $bl) {
                $bt = '0';
            } else {
                $bt = $b[$i];
            }
            if ($temp == '1' && $at == '1' && $bt == '1') {
                $temp = '1';
                $ret[$i] = '1';
            } else if ($temp == '0' && $at == '1' && $bt == '1') {
                $temp = '1';
                $ret[$i] = '0';
            } else if ($temp == '1' && $at == '1' && $bt == '0') {
                $temp = '1';
                $ret[$i] = '0';
            } else if ($temp == '0' && $at == '1' && $bt == '0') {
                $temp = '0';
                $ret[$i] = '1';
            } else if ($temp == '1' && $at == '0' && $bt == '1') {
                $temp = '1';
                $ret[$i] = '0';
            } else if ($temp == '0' && $at == '0' && $bt == '1') {
                $temp = '0';
                $ret[$i] = '1';
            } else if ($temp == '1' && $at == '0' && $bt == '0') {
                $temp = '0';
                $ret[$i] = '1';
            } else if ($temp == '0' && $at == '0' && $bt == '0') {
                $temp = '0';
                $ret[$i] = '0';
            }
        }
        if ($ret[$len-1] == '0') {
            array_pop($ret);
        }
        return implode('', array_reverse($ret));
    }
}

1021.删除最外层的括号

有效括号字符串为空 ("")、"(" + A + ")" 或 A + B,其中 A 和 B 都是有效的括号字符串,+ 代表字符串的连接。例如,"","()","(())()" 和 "(()(()))" 都是有效的括号字符串。
如果有效字符串 S 非空,且不存在将其拆分为 S = A+B 的方法,我们称其为原语(primitive),其中 A 和 B 都是非空有效括号字符串。
给出一个非空有效字符串 S,考虑将其进行原语化分解,使得:S = P_1 + P_2 + ... + P_k,其中 P_i 是有效括号字符串原语。
对 S 进行原语化分解,删除分解中每个原语字符串的最外层括号,返回 S 。

示例 1:
输入:"(()())(())"
输出:"()()()"
解释:
输入字符串为 "(()())(())",原语化分解得到 "(()())" + "(())",
删除每个部分中的最外层括号后得到 "()()" + "()" = "()()()"。

示例 2:
输入:"(()())(())(()(()))"
输出:"()()()()(())"
解释:
输入字符串为 "(()())(())(()(()))",原语化分解得到 "(()())" + "(())" + "(()(()))",
删除每隔部分中的最外层括号后得到 "()()" + "()" + "()(())" = "()()()()(())"。

示例 3:
输入:"()()"
输出:""
解释:
输入字符串为 "()()",原语化分解得到 "()" + "()",
删除每个部分中的最外层括号后得到 "" + "" = ""。

提示:
S.length <= 10000
S[i] 为 "(" 或 ")"
S 是一个有效括号字符串

C

char * removeOuterParentheses(char * S){
    int i,sum=0, j=0;
    int len = strlen(S);
    for(i=0; i<len; i++) {
        if(S[i] == '(') {
            sum +=1;
        } else {
            sum -= 1;
        }
        if(S[i] == '(' && sum > 1) {
            S[j] = '(';
            j++;
        } else if(S[i] == ')' && sum > 0) {
            S[j] = ')';
            j++;
        }
    }
    S[j] = '\0';
    return S;
}

PHP

/**
 * @param String $S
 * @return String
 */
function removeOuterParentheses($S) {
    $stack = [];
    $ret = '';
    $S = str_split($S);
    $len = count($S);
    for ($i = 0; $i < $len; $i++) {
        if ($S[$i] == '(') {
            array_push($stack, $S[$i]);
            if (count($stack) > 1) {
                $ret .= $S[$i];
            }
        } else {
            if (count($stack) > 1) {
                $ret .= $S[$i];
            }
            array_pop($stack);
        }
    }
    return $ret;
}

其它

李白打酒

话说大诗人李白,一生好饮。幸好他从不开车。
一天,他提着酒壶,从家里出来,酒壶中有酒2斗。他边走边唱:
无事街上走,提壶去打酒。
逢店加一倍,遇花喝一斗。
这一路上,他一共遇到店5次,遇到花10次,已知最后一次遇到的是花,他正好把酒喝光了。
请你计算李白遇到店和花的次序,可以把遇店记为a,遇花记为b。
则:babaabbabbabbbb 就是合理的次序。像这样的答案一共有多少呢?
请你计算出所有可能方案的个数(包含题目给出的)。

C

#include <stdio.h>
int sum = 0;
int f(int a,int b,int c) {
    if (a > 0) {
         f(a-1,b,c*2);
    }
    if (b > 0) {
        f(a,b-1,c-1);
    }
    if (a == 0 && b == 0 && c == 1) {
        sum=sum+1;
    }
    return sum;
}
int main() {
    f(5, 9, 2);
    printf("%d\n", sum);
}

字母矩阵

给定两个整数M,N,生成一个M*N的矩阵,矩阵中元素取值为A至Z的26个字母中的一个,A在右下角,其余各数按逆时针方向旋转前进,依次递增放置,当超过26时又从A开始填充。例如,当M=5,N=8时,矩阵中的内容如下:

L K J I H G F E
M D C B A Z Y D
N E N M L K X C
O F G H I J W B
P Q R S T U V A

输入描述
M为行数,N为列数,其中M,N都为大于0的整数。
输出描述
分行输出相应的结果
输入例子
4 3
输出例子
F E D
G L C
H K B
I J A

C

#include  <stdio.h>
#include  <stdlib.h>
int main() {
    short M, N;
    char **matrix, row, col, i, direction, len;
    // M = 5;
    // N = 8;
    scanf("%hd %hd", &M, &N);
    // printf("%d %d\n", M, N);

    matrix = (char**)malloc(M*sizeof(char*));
    for (row = 0; row < M; row++) {
        matrix[row] = (char*)malloc(N*sizeof(char));
        for (col = 0; col < N; col++) {
            matrix[row][col] = 0;
        }
    }

    i = 65;
    len = M * N;
    direction = 0;
    for (col = N - 1, row = M - 1; len > 0; len--) {
        matrix[row][col] = i;
        i++;
        if (i > 90) {
            i = 65;
        }
        switch (direction) {
            case 0:
                row--;
                if (row == -1 || matrix[row][col] != 0) {
                    row++;
                    direction = 1;
                    col--;
                }
                break;
            case 1:
                col--;
                if (col == -1 || matrix[row][col] != 0) {
                    col++;
                    direction = 2;
                    row++;
                }
                break;
            case 2:
                row++;
                if (row == M || matrix[row][col] != 0) {
                    row--;
                    direction = 3;
                    col++;
                }
                break;
            case 3:
                col++;
                if (col == N || matrix[row][col] != 0) {
                    col--;
                    direction = 0;
                    row--;
                }
                break;
            default:break;
        }
    }

    for (row = 0; row < M; row++) {
        for (col = 0; col < N; col++) {
            printf("%c ", matrix[row][col]);
        }
        printf("\n");
    }

    return 0;
}

PHP

<?php

list($M, $N) = fscanf(STDIN, "%d %d");

$matrix = array_map(function ($item) use ($N) {
    return array_pad([], $N , 0);
}, array_pad([], $M , []));

$count = $M * $N;
$current = 65;
$direction = 0; // 0上 1左 2下 3右

for ($col = $N - 1, $row = $M - 1; $count > 0; $count--) {
    $matrix[$row][$col] = $current;
    $current++;
    if ($current > 90) {
        $current = 65;
    }
    switch ($direction) {
        case 0:
            $row--;
            if ($row == -1 || $matrix[$row][$col] != 0) {
                $row++;
                $direction = 1;
                $col--;
            }
            break;
        case 1:
            $col--;
            if ($col == -1 || $matrix[$row][$col] != 0) {
                $col++;
                $direction = 2;
                $row++;
            }
            break;
        case 2:
            $row++;
            if ($row == $M || $matrix[$row][$col] != 0) {
                $row--;
                $direction = 3;
                $col++;
            }
            break;
        case 3:
            $col++;
            if ($col == $N || $matrix[$row][$col] != 0) {
                $col--;
                $direction = 0;
                $row--;
            }
            break;
        default:break;
    }
}

printf("%s", array_reduce($matrix,
    function($carry, $row) {
        return $carry.array_reduce($row, function($carry, $col) {
            return $carry.sprintf("%c ", $col);
        }, '')."\n";
    }, ''));

淘宝网店

NowCoder在淘宝上开了一家网店。他发现在月份为素数的时候,当月每天能赚1元;否则每天能赚2元。
现在给你一段时间区间,请你帮他计算总收益有多少。
输入描述:
输入包含多组数据。
每组数据包含两个日期from和to (2000-01-01 ≤ from ≤ to ≤ 2999-12-31)。
日期用三个正整数表示,用空格隔开:year month day。
输出描述:
对应每一组数据,输出在给定的日期范围(包含开始和结束日期)内能赚多少钱。
示例1 
输入
2000 1 1 2000 1 31
2000 2 1 2000 2 29
输出
62
29

C

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void dumpArr(int* s, int sSize) {
    for (int i = 0; i < sSize; i++) {
        printf("%d\n", *(s+i));
    }
}
int in_array(int tag) {
    int arr[] = {2, 3, 5, 7, 11};
    for (int i = 0; i < 5; i++) {
        if (arr[i] == tag) {
            return i;
        }
    }
    return -1;
}
int main() {

    struct tm** inputArr = NULL;
    int count = 0;
    int s_y, s_m, s_d, e_y, e_m, e_d;

    char sbuff[13];
    char ebuff[13];

    while (scanf("%d %d %d %d %d %d", &s_y, &s_m, &s_d, &e_y, &e_m, &e_d)) {
        if (inputArr == NULL) {
            inputArr = (struct tm**)malloc(sizeof(struct tm*)*(1+count));
        } else {
            inputArr = (struct tm**)realloc(inputArr, sizeof(struct tm*)*(1+count));
        }
        inputArr[count] = (struct tm*)malloc(sizeof(struct tm)*2);

        inputArr[count][0].tm_year = s_y - 1900;
        inputArr[count][0].tm_mon = s_m - 1;
        inputArr[count][0].tm_mday = s_d;
        inputArr[count][0].tm_hour = 0;
        inputArr[count][0].tm_min = 0;
        inputArr[count][0].tm_sec = 0;

        inputArr[count][1].tm_year = e_y - 1900;
        inputArr[count][1].tm_mon = e_m - 1;
        inputArr[count][1].tm_mday = e_d;
        inputArr[count][1].tm_hour = 0;
        inputArr[count][1].tm_min = 0;
        inputArr[count][1].tm_sec = 0;

        count++;
    }

    int* ret;
    ret = (int*)malloc(sizeof(int)*count);
    int sum;
    for (int i = 0; i < count; i++) {
        // strftime(sbuff, sizeof(sbuff), "%Y %m %d", &inputArr[i][0]);
        // strftime(ebuff, sizeof(ebuff), "%Y %m %d", &inputArr[i][1]);
        // printf("%s %s\n", sbuff, ebuff);

        time_t startTimestamp = mktime(&inputArr[i][0]);
        time_t endTimestamp = mktime(&inputArr[i][1]);
        time_t todayTimestamp = startTimestamp;

        sum = 0;
        do {
            char m[3];
            strftime(m, sizeof(m), "%m", localtime(&todayTimestamp));
            if (in_array(atoi(m)) >= 0) {
                sum += 1;
            } else {
                sum += 2;
            }
            todayTimestamp += 86400;
        } while (todayTimestamp <= endTimestamp);
        ret[i] = sum;
    }

    dumpArr(ret, count);

    return 0;
}

PHP

<?php

// 从标准输入中读取
$group = [];
while ($item = fscanf(STDIN, "%d %d %d %d %d %d")) {
    $group[] = [
        'start' => ['year' => $item[0], 'month' => $item[1], 'day' => $item[2]],
        'end' => ['year' => $item[3], 'month' => $item[4], 'day' => $item[5]],
    ];
}

$ret = [];
foreach ($group as $item) {
    $start = $item['start'];
    $end = $item['end'];

    $startTimestamp = mktime(0, 0, 0, $start['month'], $start['day'], $start['year']);
    $endTimestamp = mktime(0, 0, 0, $end['month'], $end['day'], $end['year']);
    $todayTimestamp = $startTimestamp;
    
    // date("j", 881078400); // 通过时间戳获取这是当前月的第几天
    // date("n", 881078400); // 通过时间戳获取这是几月份
    $sum = 0;
    do {
        if (in_array(date('n', $todayTimestamp), [2, 3, 5, 7, 11])) {
            $sum += 1;
        } else {
            $sum += 2;
        }
        $todayTimestamp += 86400; // 一天的时间戳 86400
    } while ($todayTimestamp <= $endTimestamp);

    $ret[] = $sum;
}

echo implode(PHP_EOL, $ret);

求1到20阶乘的和

/**
 * 1!+2!+3!+.....+20!
 */
#include <stdio.h>
long factorial(int i) {
    if (i == 1) {
        return i;
    }
    return i * factorial(i - 1);
}
int main(){
    int i;
    long sum;
    for (i = 1, sum = 0; i <= 20; i++) {
        sum += factorial(i);
    }
    printf("%ld", sum);
    return 0;
}

求 100 以内的质数

#include <stdio.h>
int main() {
    int i, j;
    for(i = 2; i < 100; i++) {
        for(j = 2; j <= i; j++) {
            if (i % j == 0) {
                break;
            }
        }
        if (i == j) {
            printf("质数%d\n", i);
        }
    }
}

数组练习

【问题描述】输入两个字符串str和tok。其中tok由若干字符构成,每个字符均可作为一个分隔字符对str进行分隔。
注意:str和tok中均可以包含空格。如果tok含有空格,则空格也作为str的分隔字符。
【输入形式】控制台分两行输入两个字符串str和tok。
【输出形式】分行输出str被分隔后的各字符串。
【样例输入】
jfi,dpf.,jfpe&df-jfpf/□□jfoef$djfo□,pe
,. □/&$-
(上例中&ldquo;□&rdquo;代表一个空格)
【样例输出】
jfi
dpf
jfpe
df
jfpf
jfoef
djfo
pe
【样例说明】输入字符串str = &ldquo;jfi,dpf.,jfpe&df-jfpf/□□jfoef$djfo□,pe&rdquo;,tok = &ldquo;,. □/&$-&rdquo;,tok中的每一个字符(包括空格)均可作为str的分隔符,输出如上例所示。
#include <stdio.h>

int in_array(char tag, char* arr, int len) {
    for (int i = 0; i < len; i++) {
        if (arr[i] == tag) {
            return i;
        }
    }
    return -1;
}

int main() {

    const int max_arr_len = 264144;

    char str[max_arr_len];
    char tok[max_arr_len];

    // char str[] = "jfi,dpf.,jfpe&df-jfpf";
    // char tok[] = ",.,&-";

    int i = 0;
    int len;
    int flg = 0; // 标记是否需要换行 0不需要 1需要

    /**
     * 题目里要求 tok 可能包含空格,所以不能用 scanf,
     * 又因为 gets 被废弃了,gets_s 是c11的特性可能不被支持,
     * 所以这里用了 fgets ,直接读取输入流
     */
    fgets(str, max_arr_len, stdin);
    fgets(tok, max_arr_len, stdin);
    
    for(len = 0; tok[len] != '\0'; ++len); // 求tok的长度
    while (str[i] != '\0') {
        if (in_array(str[i], tok, len) == -1) {
            putchar(str[i]);
            flg = 1;
        } else {
            if (flg == 1) {
                putchar('\n');
                flg = 0;
            }
        }
        i++;
    }

    return 0;
}

力扣(LeetCode)来源的题目著作权归领扣网络所有。链接:https://leetcode-cn.com

上述题目的解答均为作者所有