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

news2024/7/7 14:53:21

在这里插入图片描述

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种

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.coloradmin.cn/o/1894145.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

H5实现第三方分享功能,(WhatsApp,Facebook,Messenger,Instagram,Telegram,Zalo,Twitter/X)

1. H5实现第三方分享功能 1. WhatsApp 分享 https://api.whatsapp.com/send/?phone&app_absent0&text${codeUrl}2. Facebook 分享 https://www.facebook.com/sharer/sharer.php?u${codeUrl}3. Messenger 分享 https://www.messenger.com/?${codeUrl}4. Instagra…

​​服务拆分的原则

目录 一、单一职责原则 二、服务自治原则 三、单向依赖 一、单一职责原则 单⼀职责原则原本是面向对象设计中的⼀个基本原则, 它指的是⼀个类应该专注于单⼀功能. 不要存在多于⼀个导致类变更的原因 在微服务架构中, ⼀个微服务也应该只负责⼀个功能或业务领域, 每个服务应该…

代码随想录算法训练营第70天图论9[1]

代码随想录算法训练营第70天:图论9 ‍ 拓扑排序精讲 卡码网&#xff1a;117. 软件构建(opens new window) 题目描述&#xff1a; 某个大型软件项目的构建系统拥有 N 个文件&#xff0c;文件编号从 0 到 N - 1&#xff0c;在这些文件中&#xff0c;某些文件依赖于其他文件的…

html+css+js淘宝商品界面

点击商品&#xff0c;alert弹出商品ID 图片使用了占位符图片&#xff0c;加载可能会慢一点 你可以把它换成自己的图片&#x1f603;源代码在图片后面 效果图 源代码 <!DOCTYPE html> <html lang"zh"> <head> <meta charset"UTF-8"…

嵌入式底层系统了解

当裸机功能不复杂的时候&#xff0c;即类似与点亮一个LED灯&#xff0c;驱动LCD和OLED这样的模块&#xff0c;以及各位大学生的搭积木式的毕业设计(狗头保命&#xff09;&#xff0c;此时可以简单地分为硬件和软件层&#xff08;应用层),以及以中间层作为中间联系。 当需要实现…

代码随想录算法训练营第2天|LeetCode977,209,59

977.有序数组平方 题目链接&#xff1a; 977. 有序数组的平方 - 力扣&#xff08;LeetCode&#xff09; 文章讲解&#xff1a;代码随想录 视频讲解&#xff1a; 双指针法经典题目 | LeetCode&#xff1a;977.有序数组的平方_哔哩哔哩_bilibili 第一想法 暴力算法肯定是先将元素…

docker的安装与基本使用

一.docker的安装卸载 1.先安装所需软件包 yum install -y yum-utils2.设置stable镜像仓库 yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 3.安装DOCKER CE yum -y install docker-ce docker-ce-cli containerd.io 4.验…

【unity实战】使用Unity实现动作游戏的攻击 连击 轻重攻击和打击感

最终效果 文章目录 最终效果前言素材下载&#xff1a;玩家移动跳跃控制攻击动画配置轻攻击重攻击 攻击时禁止移动和攻击移动补偿敌人击退和播放受击动画受击特效攻击停顿和屏幕震动局部顿帧&#xff08;补充&#xff09;参考源码完结 前言 注意本文为自己的学习记录笔记&#…

微机原理 选择题

D C MOV、PUSH、POP、XLAT&#xff08;查表&#xff09;、IN、OUT不影响标志位 D B D C D C D B 1. (单选题, 5分)8位无符号数(字节)表示的数值范围是( ), 16位无符号数(字)表示的数值范围是( )。 A. 0~128 0~32768B. 0~255 0~655…

Websocket通信实战项目(js)(图片互传应用)(下)客户端H5+css+js实现

Rqtz : 个人主页 ​ 共享IT之美&#xff0c;共创机器未来 Sharing the Beauty of IT and Creating the Future of Machines Together 目录 起始 客户端GUI Javascripts连接websocket 使用localStorage保存用户输入的IP Websocket连接成功 Websocket接收数据 解析…

51-5 权限维持2 - 影子账号(隐藏用户)

权限维持技术 权限维持技术(Persistence,也称为权限持久化)是一种能够在系统重启、用户更改密码或其他可能导致访问中断的情况下保持对系统访问的技术。例如,它包括创建系统服务、利用计划任务、修改系统启动项或注册表、以及映像劫持等方法。 创建影子账户 影子账户是指隐…

Labview_Workers5.0 学习笔记

1.Local Request 个人理解该类型的请求针对自身的&#xff0c;由EHL或者MHL到该vi的MHL中。 使用快速放置快捷键"Ctrl9"创建方法如下&#xff1a; 创建后的API接口命名均为rql开头&#xff0c;并且在所选main.vi中的MHL创建对应的条件分支。 此时使用该API函数就…

【计算机毕业设计】026基于微信小程序的原创音乐

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

行业模板|DataEase旅游行业大屏模板推荐

DataEase开源数据可视化分析工具于2022年6月发布模板市场&#xff08;https://templates-de.fit2cloud.com&#xff09;&#xff0c;并于2024年1月新增适用于DataEase v2版本的模板分类。模板市场旨在为DataEase用户提供专业、美观、拿来即用的大屏模板&#xff0c;方便用户根据…

SpringBoot 启动流程二

SpringBoot启动流程二 我们首先查看构造方法 SpringApplication 我们发现这个构造方法还是在SpringApplication类里面 这个构造方法还是调用了自身的构造方法 传入了两个参数 第一个参数叫resourceLoader 传入的是一个资源加载器 要从外部读入东西 这个方法通过this关键字…

番外篇 | YOLOv8改进之即插即用全维度动态卷积ODConv + 更换Neck网络为GFPN

前言:Hello大家好,我是小哥谈。本文所做出的改进是在YOLOv8中引入即插即用全维度动态卷积ODConv和更换Neck网络为GFPN,希望大家学习之后能够有所收获~!🌈 目录 🚀1.基础概念 🚀2.网络结构 🚀3.添加步骤 🚀4.改进方法 🍀🍀步骤1:block.py文件修改…

【Android面试八股文】你是怎么保证Android设备的时间与服务器时间同步的?(使用NTP和TrueTime方案)

文章目录 一、网络时间协议(NTP)二、使用网络时间协议(NTP)2.1 使用系统提供的 NTP 服务器2.2 使用TrueTime2.2.1 引入TrueTime库2.2.2 初始化 TrueTime2.2.3 用法2.2.4 使用 TrueTime 获取时间2.2.4 自动更新时间2.2.5 注意事项二. 使用 HTTP 请求获取服务器时间2.1. 发送…

技术探索:利用Python库wxauto实现Windows微信客户端的全面自动化管理

项目地址&#xff1a;github-wxauto 点击即可访问 项目官网&#xff1a;wxauto 点击即可访问 &#x1f602;什么是wxauto? wxauto 是作者在2020年开发的一个基于 UIAutomation 的开源 Python 微信自动化库&#xff0c;最初只是一个简单的脚本&#xff0c;只能获取消息和发送…

同方威视受邀盛装亮相2024长三角快递物流展(杭州)助力行业物畅其流

同方威视技术股份有限公司携安全检测产品和综合解决方案&#xff0c;盛装亮相2024长三角快递物流展&#xff08;杭州&#xff09; 展位号&#xff1a;3C馆A07-1 时间&#xff1a;2024年7月8-10日 地址&#xff1a;杭州国际博览中心&#xff08;浙江省杭州市萧山区奔竞大道35…