作者: domain

  • 分类排序(函数)

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

    题目描述

    从键盘输入10个整数(10个整数均不相同), 然后再从键盘中输入一个整数a,
    如果该整数a为奇数, 且与这10个整数中的任一个数相同,则删掉与a相同的 这个数,并将剩下的9个数按升序排序输出;
    若a为偶数, 且与这10个数都不同,则加入a,并将这11个数降序排 序输出;
    否则,则将这10个数奇数在前,偶数在后, 降序排列输出。
    例如,10个数分别为6,89,34,12, 0,-8,78,15,9,3.
    若a为9,则输出为:-8,0,3, 6,12,15,34,78,89.
    若a为2,则输出为:89,78, 34,15,12,9,6,3,2,0,-8.
    若a为7或者12,则 输出为:89,15,9,3,78,34,12,6,0,-8.
    要求:使用函数解决本题,至少编写以下几个函数,
    1、升序排序函数void sort(int a[], int n);
    2、查找函数int find(int a[],int n,int value)—-在大小为n的a数组中查找值为value的元素,找到就返回元素的下标,找不到,就返回-1;
    3、输出函数display(int a[], int n)—逐个输出数组a的元素;
    4、反转数组函数void reverse(int a[], int n)—-将数组逆序。

    输入

    测试数据的组数n
    第一组测试数据的10个整数
    第一组的整数a
    第二组测试数据的10个整数
    第二组的整数a
    ……
    第n组测试数据的10个整数
    第n组的整数a

    输出

    第一组数据排序输出
    第二组数据排序输出
    …….
    第n组数据排序输出

    样例输入

    3
    6 89 34 12 0 -8 78 15 9 3
    9
    6 89 34 12 0 -8 78 15 9 3
    2
    6 89 34 12 0 -8 78 15 9 3
    7

    样例输出

    -8 0 3 6 12 15 34 78 89
    89 78 34 15 12 9 6 3 2 0 -8
    89 15 9 3 78 34 12 6 0 -8

    提示

    解决方案

    #include <stdio.h>
    
    #define FAILED_FIND_IN_ARRAY -1
    
    struct Array {
        int data[16];
        int size;
    };
    
    void scanToArray(struct Array *array);
    int findInArray(struct Array *array, int data);
    void sortArray(struct Array *array);
    void reverseArray(struct Array *array);
    void sortArrayInOddAndEven(struct Array *array);
    void printArray(struct Array *array);
    
    int main() {
        int ctrl;
        scanf("%d", &ctrl);
    
        while (ctrl--) {
            struct Array array = {};
            scanToArray(&array);
            int number;
            scanf("%d", &number);
            if (number % 2 != 0 && findInArray(&array, number) != FAILED_FIND_IN_ARRAY) {
                array.size -= 1;
                for (int i = findInArray(&array, number); i < array.size; ++i) {
                    array.data[i] = array.data[i + 1];
                }
                sortArray(&array);
            } else if (number % 2 == 0 && findInArray(&array, number) == FAILED_FIND_IN_ARRAY) {
                array.data[array.size] = number;
                array.size += 1;
                sortArray(&array);
                reverseArray(&array);
            } else {
                sortArrayInOddAndEven(&array);
            }
            printArray(&array);
        }
    
        return 0;
    }
    
    void scanToArray(struct Array *array) {
        array->size = 10;
        for (int i = 0; i < array->size; ++i) {
            scanf("%d", &array->data[i]);
        }
    }
    
    int findInArray(struct Array *array, int data) {
        for (int i = 0; i < array->size; ++i) {
            if (array->data[i] == data) {
                return i;
            }
        }
        return -1;
    }
    
    void sortArray(struct Array *array) {
        for (int i1 = 0; i1 < array->size - 1; ++i1) {
            for (int i2 = 0; i2 < array->size - 1 - i1; ++i2) {
                if (array->data[i2] > array->data[i2 + 1]) {
                    int data = array->data[i2];
                    array->data[i2] = array->data[i2 + 1];
                    array->data[i2 + 1] = data;
                }
            }
        }
    }
    
    void reverseArray(struct Array *array) {
        for (int i = 0; i < array->size / 2; ++i) {
            int data = array->data[i];
            array->data[i] = array->data[array->size - 1 - i];
            array->data[array->size - 1 - i] = data;
        }
    }
    
    void sortArrayInOddAndEven(struct Array *array) {
        struct Array odd = {}, even = {};
        for (int i = 0; i < array->size; ++i) {
            if (array->data[i] % 2 == 0) {
                even.data[even.size] = array->data[i];
                even.size += 1;
            } else {
                odd.data[odd.size] = array->data[i];
                odd.size += 1;
            }
        }
        sortArray(&odd);
        reverseArray(&odd);
        sortArray(&even);
        reverseArray(&even);
        for (int i = 0; i < odd.size; ++i) {
            array->data[i] = odd.data[i];
        }
        for (int i = 0; i < even.size; ++i) {
            array->data[i + odd.size] = even.data[i];
        }
    }
    
    void printArray(struct Array *array) {
        printf("%d", array->data[0]);
        for (int i = 1; i < array->size; ++i) {
            printf(" %d", array->data[i]);
        }
        printf("\n");
    }
    
  • 计算字符串的长度

    时间限制: 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