【刷题笔记(编程题)05】另类加法、走方格的方案数、井字棋、密码强度等级

在这里插入图片描述

1. 另类加法

给定两个int A和B。编写一个函数返回A+B的值,但不得使用+或其他算数运算符。
测试样例:
1,2
返回:3
示例 1
输入
输出

思路1:
二进制0101和1101的相加
0 1 0 1
1 1 0 1
其实就是
不带进位的结果1000
和进位产生的1010相加
无进位加法: 两个二进制数异或后得到的结果
就是它们无进位相加的结果
进位: 两个二进制数按位与后左移1位
就是它们相加的进位结果
在每一轮计算中
利用异或运算符计算不进位部分
利用与运算符和左移运算符计算进位部分
并将进位部分赋值给另一个操作数
直到没有进位为止
最终,不进位部分的结果即为加法的结果
在这里插入图片描述

class UnusualAdd {
public:
    int addAB(int A, int B) {
        while (B) {
            int a = A ^ B;
            int b = (A & B) << 1; 
            A = a;
            B = b;
        }
        return A;
    }
};

2. 走方格的方案数

请计算n*m的棋盘格子(n为横向的格子数,m为竖向的格子数)从棋盘左上角出发沿着边缘线从左上角走到右下角,总共有多少种走法,要求不能走回头路,即:只能往右和往下走,不能往左和往上走。
注:沿棋盘格之间的边缘线行走
数据范围:
输入描述
输入两个正整数n和m,用空格隔开。(1≤n,m≤8)
输出描述
输出一行结果
示例 1
输入
2 2
输出
6

思路1: 递归
本题说的是沿着边缘线走
而非在格子里面走
第一步可以往右或往下
起始路径(0, 0)可以选择沿着
(0+1, 0)和(0, 0+1)的路径走
而(0+1, 0)和(0, 0+1)是起始路径(0, 0)的子问题
继续往下递归,用(i, j)表示当前位置
后续限制边界的向下或向右
因为不能走回头路
当向下(向右)走到边界
表示只有向右(向下)这一条路径可走
即可结束递归,无需完全走到右下角
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include <iostream>
using namespace std;

int scheme(int i, int j, int n, int m)
{
    if (i == n || j == m)
        return 1;
    return scheme(i + 1, j, n, m) + scheme(i, j + 1, n, m);
}

int main() {
    int n, m;
    while (cin >> n >> m) { 
        cout << scheme(0, 0, n, m) << endl;
    }
    return 0;
}

思路2: 动态规划
用dp[i][j]表示到第 i 行 j 列为止的路径数
它等于到它左边的路径数
加上到它上边的路径数的总和
如果是首行或者首列路径数为1
在这里插入图片描述
(0, 0)到(0, 1)只有1条路径
(0, 0)到(1, 0)也只有1条路径
(0, 0)到(1, 1)的路径等于
它左边的路径加上它上边的路径
(0, 0)到(0, 1)的路径加上(0, 0)到(1, 0)的路径
1 + 1 = 2

int main() {
    int n, m;
    while(cin >> n >> m){
        vector<vector<int>> dp(n + 1, vector<int>(m + 1, 0)); 
        //dp[i][j]表示到第i行j列为止的路径数
        for(int i = 0; i <= n; i++)
            for(int j = 0; j <= m; j++){
                if(i == 0 && j == 0) //起始位置只有一条路径
                    dp[i][j] = 1;
                else if(i == 0) //起始行,等于左边列的路径
                    dp[i][j] = dp[i][j - 1];
                else if(j == 0) //起始列,等于上边行的路径
                    dp[i][j] = dp[i - 1][j];
                else //等于左边加上边的路径
                    dp[i][j] = dp[i][j - 1] + dp[i - 1][j];
            }
        cout << dp[n][m] << endl;
    }
    return 0;
}

3. 井字棋

给定一个二维数组board,代表棋盘,其中元素为1的代表是当前玩家的棋子,0表示没有棋子,-1代表是对方玩家的棋子。当一方棋子在横竖斜方向上有连成排的及获胜(及井字棋规则),返回当前玩家是否胜出。
测试样例:
[[1,0,1],[1,-1,-1],[1,-1,0]]
返回:true
示例 1
输入
输出

思路1:
先判断两个对角线
再for循环判断横纵

class Board {
public:
    bool checkWon(vector<vector<int> > board) {
        if (board[0][0] + board[1][1] + board[2][2] == 3
        || board[0][2] + board[1][1] + board[2][0] == 3)
            return true;
        for (int i = 0; i < board.size(); i++) {
            if (board[i][0]+board[i][1]+board[i][2] == 3)
                return true;
            if (board[0][i]+board[1][i]+board[2][i] == 3)
            	return true;
        }
        return false;
    }
};

4. 密码强度等级

密码按如下规则进行计分,并根据不同的得分为密码进行安全等级划分。
一、密码长度:
5 分: 小于等于4 个字符
10 分: 5 到7 字符
25 分: 大于等于8 个字符
二、字母:
0 分: 没有字母
10 分: 密码里的字母全都是小(大)写字母
20 分: 密码里的字母符合”大小写混合“
三、数字:
0 分: 没有数字
10 分: 1 个数字
20 分: 大于1 个数字
四、符号:
0 分: 没有符号
10 分: 1 个符号
25 分: 大于1 个符号
五、奖励(只能选符合最多的那一种奖励):
2 分: 字母和数字
3 分: 字母、数字和符号
5 分: 大小写字母、数字和符号
最后的评分标准:
= 90: 非常安全
= 80: 安全(Secure)
= 70: 非常强
= 60: 强(Strong)
= 50: 一般(Average)
= 25: 弱(Weak)
= 0: 非常弱(Very_Weak)
对应输出为:
VERY_SECURE
SECURE
VERY_STRONG
STRONG
AVERAGE
WEAK
VERY_WEAK
请根据输入的密码字符串,进行安全评定。
注:
字母:a-z, A-Z
数字:0-9
符号包含如下: (ASCII码表可以在UltraEdit的菜单view->ASCII Table查看)
!"#KaTeX parse error: Can't use function '\]' in math mode at position 76: …I码:0x3A~0x40) [\̲]̲^_` …@NoNoN
输出
VERY_SECURE
说明
样例的密码长度大于等于8个字符,得25分;大小写字母都有所以得20分;有两个数字,所以得20分;包含大于1符号,所以得25分;由于该密码包含大小写字母、数字和符号,所以奖励部分得5分,经统计得该密码的密码强度为25+20+20+25+5=95分。
示例 2
输入
Jl)M:+
输出
AVERAGE
说明
示例2的密码强度为10+20+0+25+0=55分。

思路1:
用好 if 和 else
对每个安全等级进行判断

#include <iostream>
using namespace std;

int passwordLength(string& s) {
    if (s.size() >= 5 && s.size() <= 7)
        return 10;
    else if (s.size() >= 8)
        return 25;
    else return 5;
}

int passwordLetter(string& s) {
    bool Capital = false, Lowercase = false;
    for (int i = 0; i < s.size(); i++) {
        if (s[i] >= 'A' && s[i] <= 'Z')
            Capital = true;
        else if (s[i] >= 'a' && s[i] <= 'z')
            Lowercase = true;
    }
    if (Capital == false && Lowercase == false)
        return 0;
    else if (Capital == true && Lowercase == true)
        return 20;
    else return 10;
}

int passwordFigure(string& s) {
    int count = 0;
    for (int i = 0; i < s.size(); i++) {
        if (s[i] >= '0' && s[i] <= '9')
            count++;
        if (count > 1) return 20;
    }
    if (count == 0) return 0;
    else return 10;
}

int passwordSymbol(string& s) {
    int count = 0;
    for (int i = 0; i < s.size(); i++) {
        if (s[i] >= 0x21 && s[i] <= 0x2F) count++;
        else if (s[i] >= 0x3A && s[i] <= 0x40) count++;
        else if (s[i] >= 0x5B && s[i] <= 0x60) count++;
        else if (s[i] >= 0x7B && s[i] <= 0x7E) count++;
    }
    if (count == 0) return 0;
    else if (count == 1) return 10;
    else return 25;
}

int passwordAward(int Letter, int Figure, int Symbol) {
    if (Letter == 20 && Figure >= 10 && Symbol >=10)
        return 5;
    else if (Letter == 10 && Figure >= 10 && Symbol >=10)
        return 3;
    else if (Letter == 10 && Figure >= 10)
        return 2;
    else return 0;
}

int main() {
    string s;
    cin >> s;
    int Length, Letter, Figure, Symbol, Award;
    Length = passwordLength(s);
    Letter = passwordLetter(s);
    Figure = passwordFigure(s);
    Symbol = passwordSymbol(s);
    Award = passwordAward(Letter, Figure, Symbol);
    int score = Length + Letter + Figure + Symbol + Award;
    if (score >= 90) cout << "VERY_SECURE" << endl;
    else if (score >= 80) cout << "SECURE" << endl;
    else if (score >= 70) cout << "VERY_STRONG" << endl;
    else if (score >= 60) cout << "STRONG" << endl;
    else if (score >= 50) cout << "AVERAGE" << endl;
    else if (score >= 25) cout << "WEAK" << endl;
    else if (score >= 0) cout << "VERY_WEAK" << endl;
    
    return 0;
}
class password {
public:
    password(string& s)
    : _pwd(s)
    {}

    void passwordLength() {
        if (_pwd.size() >= 5 && _pwd.size() <= 7)
            _score += 10;
        else if (_pwd.size() >= 8)
            _score += 25;
        else if (_pwd.size() <= 4) _score += 5;
    }

    void passwordLetter() {
        for (auto l : _pwd) {
            if (isupper(l)) 
                _bigLetter = true;
            else if (islower(l))
                _smallLetter = true;
        }
        if (_bigLetter && _smallLetter)
            _score += 20;
        else if (_bigLetter || _smallLetter ) 
            _score += 10;
    }

    void passwordFigure() {
        int count = 0;
        for (auto f : _pwd) {
            if (isdigit(f))  count++;
        }
        if (count >= 1) _Figure = true;
        if (count == 1) _score += 10;
        else if (count > 1) _score += 20;
}

    void passwordSymbol() {
        int count = 0;
        for (auto c : _pwd) {
            if (ispunct(c)) 
                count++;
        }
        if (count >= 1) _Symbol = true;
        if (count == 1) _score += 10;
        else if (count > 1) _score += 25;
    }

    void passwordAward() {
        if (_bigLetter && _smallLetter && _Figure && _Symbol)
            _score += 5;
        else if ((_bigLetter || _smallLetter) && _Figure && _Symbol)
            _score += 3;
        else if ((_bigLetter || _smallLetter) && _Figure)
            _score += 2;
    }

    void getTotalScore() {
        passwordLength();
        passwordLetter();
        passwordFigure();
        passwordSymbol();
        passwordAward();
    }

    void _printGrade() {
        getTotalScore();
        if (_score >= 90) cout << "VERY_SECURE" << endl;
        else if (_score >= 80) cout << "SECURE" << endl;
        else if (_score >= 70) cout << "VERY_STRONG" << endl;
        else if (_score >= 60) cout << "STRONG" << endl;
        else if (_score >= 50) cout << "AVERAGE" << endl;
        else if (_score >= 25) cout << "WEAK" << endl;
        else if (_score >= 0) cout << "VERY_WEAK" << endl;
    }
private:
    string _pwd;
    int _score = 0;
    bool _bigLetter = false;
    bool _smallLetter = false;
    bool _Figure = false;
    bool _Symbol = false;
};

int main() {
    string s;
    while (cin >> s) {
        password pwd(s);
        pwd._printGrade();
    }

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/784480.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

虚拟地址空间划分

记住&#xff1a;任何编程语言编译之后产生汇编指令数据 每一个进程的用户空间是私有的&#xff0c;内核空间是共享的(管道通信的原理) X86 32为linux环境下,虚拟地址空间结构 只读区&#xff1a; .text段:指令段&#xff0c;存放汇编指令 .rodata段:常量段&#xff0c;存放常…

Linux环境部署Python Web服务

“姑娘&#xff0c;再见面就要靠运气了&#xff0c;可别装作不认识&#xff0c;那句“好久不见”可干万别打颤…” 将使用 Python 编写的后端 API 部署到 Linux 环境中&#xff0c;可以按照以下详细步骤操作。本文将涵盖环境准备、API 编写、使用 Gunicorn 作为 WSGI 服务器、配…

C++编译链接原理

从底层剖析程序从编译到运行的整个过程 三个阶段 一、编译阶段二、链接阶段三、运行阶段 为了方便解释&#xff0c;给出两端示例代码&#xff0c;下面围绕代码进行实验&#xff1a; //sum.cpp int gdata 10; int sum(int a,int b) {return ab; }//main.cpp extern int gdata…

49.实现调试器HOOK机制

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 上一个内容&#xff1a;47.HOOK引擎优化支持CALL与JMP位置做HOOK 以 47.HOOK引擎优化支持CALL与JMP位置做HOOK 它的代码为基础进行修改 效果图&#xff1a;游…

Mysql8.0.36 Centos8环境安装

下载安装包 官网地址&#xff1a;MySQL :: Download MySQL Community Server (Archived Versions) 可以直接下载后再传到服务器&#xff0c;也可以在服务器采用wget下载。如下&#xff1a; wget https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.36-linux-glib…

mp4视频太大怎么压缩不影响画质,mp4文件太大怎么变小且清晰度高

在数字化时代&#xff0c;我们常常面临视频文件过大的问题。尤其是mp4格式的视频&#xff0c;文件大小往往令人望而却步。那么&#xff0c;如何在不影响画质的前提下&#xff0c;有效地压缩mp4视频呢&#xff1f;本文将为您揭秘几种简单实用的压缩技巧。 在分享和存储视频时&am…

ELK+Filebeat+Kafka+Zookeeper

本实验基于ELFK已经搭好的情况下 ELK日志分析 架构解析 第一层、数据采集层 数据采集层位于最左边的业务服务器集群上&#xff0c;在每个业务服务器上面安装了filebeat做日志收集&#xff0c;然后把采集到的原始日志发送到Kafkazookeeper集群上。第二层、消息队列层 原始日志发…

运维锅总详解系统设计原则

本文对CAP、BASE、ACID、SOLID 原则、12-Factor 应用方法论等12种系统设计原则进行分析举例&#xff0c;希望对您在进行系统设计、理解系统运行背后遵循的原理有所帮助&#xff01; 一、CAP、BASE、ACID简介 以下是 ACID、CAP 和 BASE 系统设计原则的详细说明及其应用举例&am…

降Compose十八掌之『飞龙在天』| Layout

公众号「稀有猿诉」 原文链接 降Compose十八掌之『飞龙在天』| Layout 页面布局是GUI应用开发的核心&#xff0c;决定着一个UI具体如何实现。今天将延着路线图来练习『降Compose十八掌』的第二招式&#xff0c;学习一下如何使用Compose中的布局来构建页面。 基础骨架 基…

前端vue打印后端对象为[object,object]

今天给自己项目进行编写前端页面时&#xff0c;惊讶的发现&#xff0c;自己进行打印后端传递的对象&#xff0c;一直显示未[object,object]&#xff0c;如下图所示&#xff1a; 感觉很奇怪&#xff0c;于是我猜测是不是自己获取的返回数据的问题&#xff0c;在进行添加了datat…

Windows10/11家庭版开启Hyper-V虚拟机功能详解

Hyper-V是微软的一款虚拟机软件&#xff0c;可以使我们在一台Windows PC上&#xff0c;在虚拟环境下同时运行多个互相之间完全隔离的操作系统&#xff0c;这就实现了在Windows环境下运行Linux以及其他OS的可能性。和第三方虚拟机软件&#xff0c;如VMware等相比&#xff0c;Hyp…

云计算【第一阶段(28)】DNS域名解析服务

一、DNS解析的定义与作用 1.1、DNS解析的定义 DNS解析&#xff08;Domain Name System Resolution&#xff09;是互联网服务中的一个核心环节&#xff0c;它负责将用户容易记住的域名转换成网络设备能够识别和使用的IP地址。一般来讲域名比 IP 地址更加的有含义、也更容易记住…

202487读书笔记|《我有个拥抱,你要不要》——生活从来如此,你的态度赋予它意义

202487读书笔记|《我有个拥抱&#xff0c;你要不要》——生活从来如此&#xff0c;你的态度赋予它意义 《我有个拥抱&#xff0c;你要不要》作者一天到晚气fufu&#xff0c;挺有愛的小漫画&#xff0c;适合用来看图说话锻炼小语言&#xff0c;我看的很快乐也写得很痛快&#xf…

打卡第6天----哈希表

每天进步一点点,滴水石穿,日积月累,不断提升。 数组和链表章节告一段落。开启哈希表相关的。 哈希表能解决什么问题呢,一般哈希表都是用来快速判断一个元素是否出现集合里 一、有效的字母异位词 leetcode题目编号:242 题目描述: 给定两个字符串 s 和 t ,编写一个函数…

国内教育科技公司自研大语言模型

好未来的数学大模型九章大模型&#xff08;MathGPT&#xff09; 2023年8月下旬&#xff0c;在好未来20周年直播活动中&#xff0c;好未来公司CTO田密宣布好未来自研的数学领域千亿级大模型MathGPT正式上线并开启公测。根据九章大模型的官网介绍&#xff0c;九章大模型&#xff…

语言模型的进化:从NLP到LLM的跨越之旅

在人工智能的浩瀚宇宙中&#xff0c;自然语言处理&#xff08;NLP&#xff09;一直是一个充满挑战和机遇的领域。随着技术的发展&#xff0c;我们见证了从传统规则到统计机器学习&#xff0c;再到深度学习和预训练模型的演进。如今&#xff0c;我们站在了大型语言模型&#xff…

搭建基础库~

前言 项目中会用到工具库、函数库以及一些跟框架绑定的组件&#xff0c;如果这些基础模块每个项目都实现一套&#xff0c;维护起来那真的头大&#xff0c;你说呢&#x1f609; 搭建流程 准备工作 创建文件夹myLib、安装Git以及pnpm 目录大概就系这样子&#xff1a; myLib ├…

你真的会信息收集嘛,4k字渗透测试信息收集10大技巧

前言 在渗透测试中&#xff0c;信息收集是非常关键的一步&#xff0c;它为后续的漏洞发现和利用提供了重要的基础。以下是非常详细的信息收集方式&#xff1a; 一、被动信息收集 被动信息收集是指在不与目标系统直接交互的情况下&#xff0c;通过公开渠道获取目标系统的相关…

LabVIEW在半导体自动化测试中的应用

半导体制造的复杂性和精密度要求极高&#xff0c;每一个生产步骤都需要严格的控制和监测。自动化测试设备在半导体制造中起到了关键作用&#xff0c;通过精密测量和数据分析&#xff0c;确保产品质量和生产效率。本文介绍如何使用LabVIEW结合研华硬件&#xff0c;开发一个用于半…

Nacos注册中心相关错误记录

文章目录 1&#xff0c;com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery:jar:unknown was not found1.1 定位及解决方案1.2&#xff0c;简要说明dependencyManagement的作用 2&#xff0c;nacos启动失败2.1 解决方案 1&#xff0c;com.alibaba.cloud:spring-c…