计算字符串的长度

时间限制: 1 Sec 内存限制: 128 MB

题目描述

计算字符串S的长度,功能与strlen函数相同,但不能调用库函数strlen,否则不给分。输入的字符串不包含空格。

输入

输入测试组数t
对于每组测试,输入字符串S(长度<=30)

输出

对于每组测试,输出S的长度

样例输入

1
hehe

样例输出

4

提示

解决方案

#include <iostream>

int main() {
    int ctrl;
    std::cin >> ctrl;
    while (ctrl--) {
        char str[64] = {};
        std::cin >> str;
        int length = 0;
        while (str[++length] != '\0');
        std::cout << length << std::endl;
    }

    return 0;
}

单词统计

时间限制: 1 Sec 内存限制: 128 MB

题目描述

编写一个程序,根据单词的出现频率降序打印出所输入的的各个单词。每个单词前标有它的计数值。

输入

各个单词,输入0则表示单词结束

输出

降序打印单词出现的频率和单词。单词频度相同,按出现顺序输出。

样例输入

bad
good
bad
cute
how
good
good
0

样例输出

3 good
2 bad
1 cute
1 how

提示

解决方案

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

struct Pair {
    std::string string;
    int count;
    Pair(std::string &string, int count) : string(string), count(count) {}
};
bool operator==(Pair &pair, const std::string &string) {
    return pair.string == string;
}
bool operator<(const Pair &lhs, const Pair &rhs) {
    return lhs.count > rhs.count; // NG
}

int main() {
    std::vector<Pair> vector;
    std::string string;
    std::cin >> string;
    while (string != "0") {
        std::vector<Pair>::iterator it = std::find(vector.begin(), vector.end(), string);
        if (it != vector.end()) {
            it->count += 1;
        } else {
            vector.push_back(Pair(string, 1));
        }
        std::cin >> string;
    }
    std::sort(vector.begin(), vector.end());
    for (int i = 0; i < vector.size(); ++i) {
        std::cout << vector[i].count << ' ' << vector[i].string << std::endl;
    }

    return 0;
}

安卓通过 adb 将 TF(SD)卡用作内置存储

手上有个 360 N6,平时当备用机,存点音乐视频什么的,存储空间不太够,于是乎买了张 TF 卡插上。(其实应该去看看紫光的超级 SIM 卡能不能用的,深圳联通公众号上也发可以参加预存话费赠卡的活动了)

我的第一部智能手机买的是黑莓 Priv,插卡之后会提示格式化成外置的便携式存储(可以拔出来在不同设备,比如电脑上交换数据)还是内置存储(不能用在其它机器上),并且使用非常正常。

好了问题来了,N6 插卡之后只能格式化成外置存储(?),这就很蛋疼,插卡的意义似乎就不大。后面发现其实可以用 adb 开启,虽然好像还是有点问题。

But how?

可以用 sm 来做到。

首先连续多次点按设置->系统->关于手机->版本号,打开开发者选项,然后在开发者选项中打开 USB 调试。此时可以把手机连接到电脑上了。

我正在使用 Android Studio,安装过 Android SDK,可以直接在 C:\Users\domain\AppData\Local\Android\Sdk\platform-tools 中找到 adb 工具。没有也没关系,从 SDK平台工具版本说明 | Android 开发者 | Android Developers 可以下载到独立的工具包。

已经有了 platform-tools 之后,进入该目录,按住 Shift 再点击鼠标右键可以在该目录打开 PowerShell。此时运行:

PS C:\Users\domain\AppData\Local\Android\Sdk\platform-tools> .\adb.exe devices
List of devices attached
* daemon not running; starting now at tcp:5037
* daemon started successfully
1f95707d        unauthorized

显示未授权,此时手机上应该会弹窗是否允许电脑进行调试(以及一个密钥),允许后再次执行:

PS C:\Users\domain\AppData\Local\Android\Sdk\platform-tools> .\adb.exe devices
List of devices attached
1f95707d        device

此时可以:

PS C:\Users\domain\AppData\Local\Android\Sdk\platform-tools> .\adb.exe shell
QK1707:/ $

有了手机的 Shell 了,尝试 sm 工具查看存储:

QK1707:/ $ sm list-disks
disk:179,64

如果手机允许:

QK1707:/ $ sm has-adoptable
true

反之则可能需要尝试 sm set-force-adoptable true。接下来 就可以:

QK1707:/ $ sm partition disk:179,64 private

来将存储卡格式化为内置存储。如果执行:

QK1707:/ $ sm partition disk:179,64 mixed 30

可以将部分空间格式化为内置存储,另一部分(30%)作为便携式存储。

此时可以在设置中看到存储卡已经被设置为内置存储了。发现容量显示有问题,而且迁移也有点问题。网友分享格机后,安装应用不要打开马上迁移就没有问题。决定这几天格机再试一下。

引用:
android – How to turn a portable SD card into internal storage via ADB command? – Stack Overflow
透過ADB方式開啟與配置Adoptable Storage空間(免root) @ 老梁’s blog :: 隨意窩 Xuite日誌
360N7Lite免root安装应用到内存卡的方法及其它玩机教程-更新自动安装到内存卡_360社区

PowerShell Get-FileHash

Get-FileHash
   [-Path] <String[]>
   [[-Algorithm] <String>]
   [<CommonParameters>]
PS D:\Downloads> Get-FileHash .\cn_windows_10_enterprise_ltsc_2019_x64_dvd_9c09ff24.iso -Algorithm SHA1 | Format-List   

Algorithm : SHA1
Hash      : 24B59706D5EDED392423936C82BA5A83596B50CC
Path      : D:\Downloads\cn_windows_10_enterprise_ltsc_2019_x64_dvd_9c09ff24.iso

支持的算法:
SHA1, SHA256, SHA384, SHA512, MD5。

引用:
Get-FileHash

K2P 路由器刷固件

现在应该已经没有什么货了,还在卖的不是旧就是价格已经不值得买了。写这篇…就当纪念一下吧。

相关链接可以参考一下:

不漏油的路由器不是好矿机——矿渣路由器盘点_值客原创_什么值得买
一个垃圾佬的2019年终总结——盘点这一年好玩的矿渣_值客原创_什么值得买
捡矿渣一时爽,一直捡一直爽——年度矿渣盘点_值客原创_什么值得买

配置应该是 MT7621A,RAM 128M,Flash 16M,全千兆网口,没有 USB 接口。

按照惯例,先刷入 Breed。先到 Boot and Recovery Environment for Embedded Devices (BREED) 准备好 breed-mt7621-phicomm-k2p.bin

由于没有后门开 SSH,对于部分版本的固件,恩山上有个比较简单的方法就是用 phitools 的激活 Telnet 工具(有空再研究下原理好了),也可以用其它方法开启。例如,K2/K2P/K3/K3C 新版固件 Telnet 激活工具 – 斐讯无线路由器以及其它斐迅网络设备 – 恩山无线论坛

开启Telnet之后,将事先准备好的Breed传入。先md5sum验证bin文件是否损坏。然后刷入。

root@K2P:/tmp# md5sum breed-mt7621-phicomm-k2p.bin
root@K2P:/tmp# cat /proc/mtd
dev:    size   erasesize  name
mtd0: 01000000 00010000 "ALL"
mtd1: 00030000 00010000 "Bootloader"
mtd2: 00010000 00010000 "Config"
mtd3: 00010000 00010000 "Factory"
mtd4: 00050000 00010000 "permanent_config"
mtd5: 00f60000 00010000 "firmware"
mtd6: 00c48b96 00010000 "rootfs"
mtd7: 00200000 00010000 "rootfs_data"
root@K2P:/tmp# mtd -r write /tmp/breed-mt7621-phicomm-k2p.bin Bootloader

静待重启。重启后应该能正常进系统。直插 LAN1 接口,按住 RESET(别急着放开,建议拿个东西垫着不然可能有点痛),插上电源线。此时访问 192.168.1.1 应该能进入 Breed Web 控制台。

同样,备份->恢复出厂设置->更新固件即可。

Newifi3 路由器刷固件

通常称为新路由3,CPU 是 MT7621A,内存 512MB,32MB Flash,1 个 USB3.0 口,全千兆网口。经常被拿来和 K2P 比较,新3的无线算是一个比较大的槽点吧,其它应该还好(除了漏油)。

整了一台来学习 OpenWRT。现在好像存货量还很大,价格还不错。

到手先刷入 Breed。这是一个 BootLoader,刷入后,你就能在 Breed 中刷入固件了。这样通常能保证路由器不会变砖,即使刷了错的固件。有关 Breed 的更多信息,可以跳转恩山上 hackpascal 的帖子AR/QCA/MTK Breed,功能强大的多线程 Bootloader – OPENWRT专版 – 恩山无线论坛了解。

备份一个方便自己下载。来源:新路由3 (Newifi D2) 免拆机免解锁刷 Breed 教程 – newifi无线路由器及网络设备 – 恩山无线论坛

为了刷入这个解锁文件,按照上面帖子教程操作即可。主要步骤就是:

  • 开启 SSH,这样就可以在命令行中任意控制路由器了。解锁管理界面后访问http://192.168.99.1/newifi/ifiwen_hss.html(后门?),显示 success 就 OK。
  • 把解压得到的 newifi-d2-jail-break.ko 传到路由器中。你可以有无数种方法来做到这一点,包括但不限于直接 SFTP,启动一个文件服务器(比如 HTTP Server)给路由器下载之类的方法。
  • SSH 中,切换至你刚传入文件的所在文件夹,执行 insmod newifi-d2-jail-break.ko 即可。静待路由器重启。

此时应该准备一份你想要刷入的固件。网线只插入 LAN1,连接电脑,按住 reset(新三建议用取卡针,别急着放开)然后连接电源线。闪灯后不久应该就能在电脑上通过 192.168.1.1 来访问 Breed 的 Web 控制台了。

这个时候可以随意烧写你想要的固件了。备份->恢复出厂设置->更新固件,选择你想要的固件即可。

求矩阵的最大和最小值

时间限制: 1 Sec 内存限制: 128 MB

题目描述

定义一个函数用一级指针接收一个任意行任意列的矩阵并返回该矩阵元素的最大和最小值.

输入

矩阵的行数 矩阵的列数
矩阵各元素的值

输出

最大值
最小值

样例输入

3 3
1 2 3
4 5 6
7 8 9

样例输出

9
1

提示

解决方案

#include <iostream>

void findMinAndMaxValues(int *ptr, int row, int col);

int main() {
    int row, col;
    std::cin >> row >> col;
    int mat[row][col];
    for (int ir = 0; ir < row; ++ir) {
        for (int ic = 0; ic < col; ++ic) {
            std::cin >> mat[ir][ic];
        }
    }
    findMinAndMaxValues(&mat[0][0], row, col);

    return 0;
}

void findMinAndMaxValues(int *ptr, int row, int col) {
    int min = *ptr, max = *ptr;
    for (int ir = 0; ir < row; ++ir) {
        for (int ic = 0; ic < col; ++ic) {
            if (ptr[ir * col + ic] < min) {
                min = ptr[ir * col + ic];
            }
            if (ptr[ir * col + ic] > max) {
                max = ptr[ir * col + ic];
            }
        }
    }
    std::cout << max << std::endl << min << std::endl;
}

Node.js http-server

体验应该要好得多。如果你想把它当作一个简单的控制台上的 HTTP Server,可以先使用 npm 安装:

npm install --global http-server

然后就可以使用了:

http-server [path] [options]

使用 -p--port 来指定端口;使用 -a 来绑定地址;使用 -d 来指定目录。更多选项可以看文档。

你也可以直接:

npx http-server [path] [options]

引用:
http-server – npm
http-party/http-server: a simple zero-configuration command-line http server
The npm Blog — Introducing npx: an npm package runner

Python SimpleHTTPServer

这篇并不是在讨论 Python HTTP servers 的各种用法,而是记录给某些懒人们用的如何启动 SimpleHTTPServer。

正如其名,它只是个简单实现,因为安全等因素,你不应该把它用于生产环境。

如果你正在使用 Python2,那么你应该:

python -m SimpleHTTPServer 8000

如果你正在使用 Python3,那么:

python -m http.server 8000 --bind 127.0.0.1

从 3.4 开始,引入了参数 --bind;从 3.6 开始,参数 --bind 支持 IPv6。

从 3.7 开始,可以使用 --directory 来指定目录。

引用:
SimpleHTTPServer — Simple HTTP request handler
http.server — HTTP servers

CMake 指定源码目录和构建目录

在 CMake 3.13 或更新的版本中,可以使用:

cmake -S . -B build -G "Unix Makefiles"

来指定当前目录为源码目录,构建二进制文件到 build 文件夹中。

对于 CMake 3.13 之前的版本,需要给定没有写在文档中的参数:

cmake -H. -Bbuild -G "Unix Makefiles"

(参数和目录之间没有空格)

引用:
configuration – Getting CMake to build out of source without wrapping scripts – Stack Overflow