#字棋
描述
给定一个二维数组board,代表棋盘,其中元素为1的代表是当前玩家的棋子,0表示没有棋子,-1代表是对方玩家的棋子。当一方棋子在横竖斜方向上有连成排的及获胜(及井字棋规则),返回当前玩家是否胜出。
测试样例:
[[1,0,1],[1,-1,-1],[1,-1,0]]
返回:true
本题一开始我想的是把成功的情况枚举出来,但这种方法是不被认可的,因为不能处理N*N的情况
【题目解析】: 井字棋,是一种在3*3格子上进行的连珠游戏,三个相同就代表获胜。 【解题思路】: 井字棋有四种情况表示当前玩家获胜,1代表当前玩家棋子
行全为1, 即行的和为3 /检查每一行的和是是否等于row
列全为1, 列的和为 3 /检查每一列的和是是否等于row
主对角全为1, 对角和为3 /检查主对角线的和是是否等于row
副对角全为1, 对角和为3 /检查副对角线的和是是否等于ro w
如果扩展为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;
}
};
密码强度等级
描述
密码按如下规则进行计分,并根据不同的得分为密码进行安全等级划分。
一、密码长度:
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。现给定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;
}
}