3.25/OJ练习/打卡

  1. #字棋

描述

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

测试样例:

[[1,0,1],[1,-1,-1],[1,-1,0]]

返回:true

本题一开始我想的是把成功的情况枚举出来,但这种方法是不被认可的,因为不能处理N*N的情况

【题目解析】: 井字棋,是一种在3*3格子上进行的连珠游戏,三个相同就代表获胜。 【解题思路】: 井字棋有四种情况表示当前玩家获胜,1代表当前玩家棋子

  1. 行全为1, 即行的和为3 /检查每一行的和是是否等于row

  1. 列全为1, 列的和为 3 /检查每一列的和是是否等于row

  1. 主对角全为1, 对角和为3 /检查主对角线的和是是否等于row

  1. 副对角全为1, 对角和为3 /检查副对角线的和是是否等于ro w

  1. 如果扩展为N*N的话,判断和是否等于N,下 面代码适用任何情况

class Board {
  public:
    bool checkWon(vector<vector<int> > board) {
        int row = board.size();
        for (int i = 0; i < row; i++) {
            int sum = 0;
            for (int j = 0; j < row; j++) {
                sum += board[i][j];
            }
            if (sum == row)
                return true;
        }
        for (int i = 0; i < row; i++) {
            int sum = 0;
            for (int j = 0; j < row; j++) {
                sum += board[j][i];
            }
            if (sum == row)
                return true;
        }
        int sum = 0;
        for (int i = 0; i < row; i++) {
            sum += board[i][i];
        }
        if (sum == row)
            return true;
         sum = 0;
        for (int i = row-1; i >=0; i--) {
            sum += board[i][i];
        }
        if (sum == row)
            return true;
        return false;
    }
};
  1. 密码强度等级

描述

密码按如下规则进行计分,并根据不同的得分为密码进行安全等级划分。

一、密码长度:

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查看)

!"#$%&'()*+,-./ (ASCII码:0x21~0x2F)

:;<=>?@ (ASCII码:0x3A~0x40)

[\]^_` (ASCII码:0x5B~0x60)

{|}~ (ASCII码:0x7B~0x7E)

提示:

1 <= 字符串的长度<= 300

输入描述:

输入一个string的密码

输出描述:

输出密码等级

示例1

输入:

38$@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分。

#include <iostream>
using namespace std;
#include <string>
#include<vector>
int scoretolevel(int score) {
    if (score >= 90)
        return 0;
    else if (score >= 80)
        return 1;
    else if (score >= 70)
        return 2;
    else if (score >= 60)
        return 3;
    else if (score >= 50)
        return 4;
    else if (score >= 25)
        return 5;
    else
        return 6;
}
string& _main() {//不可以乱用引用啊会吃亏的,里面记得用全局数据static修饰
    string str;
    cin >> str;
    int size = str.size();
    int score = 0;
    static vector<string> scores{"VERY_SECURE",
                          "SECURE",
                          "VERY_STRONG",
                          "STRONG",
                          "AVERAGE",
                          "WEAK",
                          "VERY_WEAK"};
    if (size > 0 && size <= 4)
        score += 5;
    else if (size > 4 && size <= 7)
        score += 10;
    else
        score += 25;
    int Lettercount = 0;
    int lettercount = 0;

    int numcount = 0;
    int symbolcount = 0;
    int expectcount = 0;
    for (int i = 0; i < size; i++) {
        if (str[i] >= 'a' && str[i] <= 'z')
            lettercount++;
        if (str[i] >= 'A' && str[i] <= 'Z')
            Lettercount++;

        if (str[i] >= '0' && str[i] <= '9')
            numcount++;
        if ((str[i] >= 33 && str[i] <= 47) ||
                (str[i] >= 58 && str[i] <= 64) ||
                (str[i] >= 91 && str[i] <= 96) ||
                (str[i] >= 123 && str[i] <= 126))
            symbolcount++;
    }
    int sum = (lettercount = lettercount > 0 ? 10 : 0 ) + (Lettercount = Lettercount
              > 0 ? 10 : 0 ) + (numcount = numcount > 1 ? 20 : 10 * numcount) +
              (symbolcount = symbolcount > 1 ? 25 : 10 * symbolcount);
    score += sum;
    if (lettercount && Lettercount && numcount && symbolcount) {
        score += 5;
        return scores[scoretolevel(score)];
    } else if ((lettercount || Lettercount) && numcount && symbolcount) {
        score += 3;
        return scores[scoretolevel(score)];
    } else if ((lettercount || Lettercount) && numcount) {
        score += 2;
        return scores[scoretolevel(score)];
    } else
        return scores[scoretolevel(score)];


}
int main() {
    string str(_main());
    cout << str;
    return 0;
}
// 64 位输出请用 printf("%lld")
  1. 最近公共祖先

描述

将一棵无穷大满二叉树的结点按根结点一层一层地从左往右编号,根结点编号为1。现给定a,b为两个结点。设计一个算法,返回a、b最近的公共祖先的编号。注意其祖先也可能是结点本身。

测试样例:

2,3

返回:1

class LCA {
public:
    int getLCA(int a, int b) {   
    while (a!=b)
    {
        if(a>b)
        a/=2;
        else
        b/=2;
    }    
    return a;;
    // write code here
}
};

4. 求最大连续bit数

描述

求一个int类型数字对应的二进制数字中1的最大连续数,例如3的二进制为00000011,最大连续2个1

数据范围:数据组数: 1≤t≤5 , 1≤n≤500000

进阶:时间复杂度: O(logn) ,空间复杂度: O(1)

输入描述:

输入一个int类型数字

输出描述:

输出转成二进制之后连续1的个数

示例1

输入:

200

输出:

2

【解题思路】: 根据位运算,获取每一位的二进制值。获取第i位的值: (n >> i) & 1。如果1连续,则计数累加,如果不连 续,则从0开始计数。

#include <iostream>
using namespace std;
#include<algorithm>

int main()
{
    int t=1;
    //cin>>t;
    while(t--)
    {
        int n=0;
        cin>>n;
        int m=0;
        int tmp=0;
        int count=0;
        while(m!=32)
        {
            while(m!=32&&(n>>m&1))
            {
            m++;
            tmp++;
            }
            m++; 
            count=max(count,tmp);
            tmp=0;
        }
        cout<<count;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值