当前位置: 首页 > web >正文

第一部分笔试Day_01到Day24_每天两道OJ

Day_01

这题实在不懂


这题脑子抽了,以为死循环,随便选了个C,赋值后是什么就是什么啊,不是恒为真


这题,5左移五位是32,移到第六位了,减1还有五个1,看成移到第五位还有四个1,且异或相乘是逻辑与了,选了B,在学校上傻了。


牛客编程_组队竞赛

组队竞赛__牛客网

代码

(自己想的排序后输出中间1/3,想错了)

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() 
{long long n = 0, sum = 0;cin >> n;int v[3 * n];for (int i = 0; i < 3 * n; i++) {cin >> v[i];}sort(v, v + 3 * n); // 排序后依次拿最左边和最右边两个组队int i = 3*n - 2;while(n--) {sum += v[i]; // 中间值是最右边两个的左边元素i -= 2;}cout << sum;return 0;
}
// 64 位输出请用 printf("%lld")

牛客编程_删除公共字符

删除公共字符__牛客网

法一代码(暴力)

#include <iostream>
#include <string>
using namespace std;
int main()
{string s1, s2, ret = "";getline(cin, s1);getline(cin, s2);for (auto& e : s1){if (s2.find(e) == s2.npos){ret += e;}}cout << ret;return 0;
}

法二代码(哈希)

#include <iostream>
#include <string>
using namespace std;
int main()
{string s1, s2, ret = "";getline(cin, s1);getline(cin, s2);int hash[256] = {0};for(auto& e : s2){hash[e]++;}for(auto& e : s1){if(hash[e] == 0){ret += e;}}cout << ret << endl;return 0;
}

Day_02

不太懂位置,选了D,%m.nf,m是对齐数,默认右对齐,加负号是右对齐,n是精度。


以为(1)是野指针错了,选了B,指针和引用区别:指针声明时可以不给值。


选对了但是理解有点错?


应该理解对了啊,点错了?点了D??????


不太理解位段和字节大小,选了B。


&a变成数组指针,+1偏移一个数组大小,指到4的右边,以为指到2选了B。


牛客编程_排序子序列

排序子序列_牛客笔试题_牛客网


自己的未通过代码:

(什么时候变成大佬了改一改)

#include <iostream>
#include <vector>
using namespace std;
int main()
{int n = 0;cin >> n;vector<int> v(n);for (int i = 0; i < n; ++i){cin >> v[i];}int cnt = 0, new_flag = 0, old_flag = 0; // cnt是极值if (v[1] - v[0] >= 0) // 1是递增,-1是递减,0是不变{new_flag = 1;old_flag = 1;}for (int i = 1; i < n; ++i){if (v[i] - v[i - 1] > 0)new_flag = 1;else if (v[i] - v[i - 1] < 0)new_flag = 0;if (new_flag != old_flag)cnt++;old_flag = new_flag;}cout << cnt + 1;return 0;
}

看了题解通过的代码:

#include <iostream>
#include <vector>
using namespace std;
int main()
{int n = 0, cnt = 0;cin >> n;vector<int> v(n + 1, 0); // 防止数组越界for (int i = 0; i < n; ++i){cin >> v[i];}for (int i = 0; i < n; ++i){if (v[i+1] > v[i]) // 非递减{while(i < n && v[i + 1] >= v[i]){++i; // i走到非递减尽头}++cnt;}else if (v[i + 1] < v[i]) // 非递增{while(i < n && v[i + 1] <= v[i]){++i; // i走到非递增尽头}cnt++;}}cout << cnt;return 0;
}

牛客OR62 倒置字符串

倒置字符串_牛客题霸_牛客网

倒置字符串__牛客网


自己写的通过的代码。

#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{string str;getline(cin, str, '\n');vector<string> v;string tmp;for (size_t i = 0; i < str.size(); ++i){if (str[i] != ' '){tmp += str[i];}else if (str[i] == ' '){v.push_back(tmp);tmp = "";}}v.push_back(tmp);int left = 0, right = v.size() - 1;while (left < right){string tmp2 = v[left];v[left] = v[right];v[right] = tmp2;++left;--right;}for (auto& e : v){cout << e << " ";}return 0;
}

看了题解敲的代码

#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{string str;getline(cin, str, '\n');auto begin = str.begin(), end = str.end();reverse(begin, end);auto left = begin;auto right = begin;while(right < end){while(right < end && *right != ' '){++right;}reverse(left, right);if(right != end){left = right + 1;}++right;}cout << str;return 0;
}

Day_03

%S打印到\0才停止!!!!!!!


以为全对,for语句初始化只执行一次!!!!!!!!!!!!!!!!!!


不懂,选了A。

long是8字节,%d打印四字节,只有前两个%d有作用。


牛客OR59 字符串中找出连续最长的数字串

字符串中找出连续最长的数字串_牛客题霸_牛客网


解析代码

#include <iostream>
#include <cctype>
using namespace std;
int main()
{string str, tmp = "", ret = "";cin >> str;for (int i = 0; i <= str.size(); ++i){if (isdigit(str[i])){tmp += str[i];}else{if (tmp.size() > ret.size()){ret = tmp;}tmp = "";}}cout << ret;return 0;
}

牛客JZ39 数组中出现次数超过一半的数字

数组中出现次数超过一半的数字_牛客题霸_牛客网


解析代码

class Solution {
public:int MoreThanHalfNum_Solution(vector<int> numbers) {int cnt = 0 , ret = 0;for(int i = 0; i < numbers.size(); ++i){if(cnt == 0){ret = numbers[i];cnt++;}else {ret == numbers[i] ? ++cnt : --cnt;}}return ret;}
};

Day_04

不知道有进制这回事。。。。。。


脑子抽了选了B?????????


观察选了D,太麻烦看了答案都不想算。


思路知道的,应该算到2就没把自己算上?选了A


牛客WY33 计算糖果

计算糖果_牛客题霸_牛客网

#include <iostream>
using namespace std;
bool isTrue(int a)
{if (a <= 30 && a >= -30){return true;}return false;
}
int main()
{int x1, x2, x3, x4;cin >> x1 >> x2 >> x3 >> x4;int a = (x1 + x3) / 2;int b = (x2 + x4) / 2;int c = x4 - b;if (isTrue(a) && isTrue(b) && isTrue(c) &&a - b == x1 && b - c == x2 && a + b == x3 && b + c == x4){cout << a << " " << b << " " << c;}else{cout << "No";}return 0;
}

牛客DD5 进制转换

进制转换_牛客题霸_牛客网

#include <algorithm>
#include <iostream>
#include <string>
#include <cstring>
using namespace std;int main()
{int m = 0, n = 0;cin >> m >> n;if (m == 0){cout << 0;return 0;}string ret = "", str = "0123456789ABCDEF";bool flag = false;if (m < 0){m = -m;flag = true;}while (m > 0){ret += str[m % n];m /= n;}if (flag)ret += '-';reverse(ret.begin(), ret.end());cout << ret;return 0;
}

Day_05

应该是懂的吧,选错了还是粗心选了A?第一次对九个。


牛客WY18 统计回文

统计回文_牛客题霸_牛客网

#include <iostream>
#include <string>
using namespace std;
bool isCircal(const string& str)
{int left = 0, right = str.size() - 1;while (left < right){if (str[left++] != str[right--]){return false;}}return true;;
}
int main()
{string s1, s2;getline(cin, s1);getline(cin, s2);int cnt = 0;for (int i = 0; i <= s1.size(); ++i){string tmp = s1;if (isCircal(tmp.insert(i, s2))){++cnt;}}cout << cnt;return 0;
}

牛客DD1 连续最大和

连续最大和_牛客题霸_牛客网

#include <climits>
#include <iostream>
#include <vector>
using namespace std;
int main()
{int n = 0;cin >> n;vector<int> arr(n);for (int i = 0; i < n; ++i){cin >> arr[i];}int ret = arr[0];for (int i = 1; i < arr.size(); i++) {arr[i] += max(arr[i - 1], 0);ret = max(ret, arr[i]);}/*int ret = -INT_MAX, sum = 0;for (int i = 0; i < n; ++i){for (int j = i; j < n; ++j){sum += arr[j];ret = max(ret, sum);}sum = 0;}*/cout << ret;return 0;
}

Day_06

脑子抽了?以为是6 / 17 = 2 emmmmm,


牛客WY16 不要二

不要二_牛客题霸_牛客网

用贪心的思想来做,开始将棋盘map全置为1,1代表放入蛋糕。

        从左向右从上到下遍历棋盘开始依此放蛋糕,然后将该块蛋糕上下左右欧几里得距离为2的点全部标记为0,意思为该点不能再放入蛋糕,如果下一步扫到的0,则跳过该点,如果扫到1,则计数器cnt++,继续把周围距离为2的点标记为0。扫完棋盘就AC了。

#include <iostream>
#include <vector>
using namespace std;
int main() 
{int w = 0, h = 0, cnt = 0;cin >> w >> h;//cin >> h >> w;vector<vector<int>> arr(w, vector<int>(h, 1));for (int i = 0; i < w; ++i) {for (int j = 0; j < h; ++j) {if (arr[i][j] == 1) {if (i + 2 < w)arr[i + 2][j] = 0;if (j + 2 < h)arr[i][j + 2] = 0;cnt++;}}}cout << cnt;return 0;
}

字符串转整数

把字符串转换成整数__牛客网

class Solution {public:int StrToInt(string str) {long long ret = 0;int n = str.size();int flag = 1, i = 0;if (str[0] == '+')str[0] = '0';if (str[0] == '-') {flag = -1;i = 1;}for (; i < n; ++i) {if (str[i] < '0' || str[i] > '9') {return 0;}ret *= 10;ret += str[i] - '0';}return flag * ret;}
};


Day_07

不应该全错吗???????


选了a,a私有能在类内初始化。。。。。。。



牛客WY22 Fibonacci数列

Fibonacci数列_牛客题霸_牛客网

#include <iostream>
using namespace std;
int main() 
{int f1 = 0, f2 = 1, f3 = 1, n = 0;cin >> n;while (true) {f3 = f1 + f2;if (n >= f2 && n <= f3)break;f1 = f2;f2 = f3;}cout << min(f3 - n, n - f2);return 0;
}

牛客_合法括号序列判断

合法括号序列判断__牛客网

class Parenthesis {public:bool chkParenthesis(string A, int n){if (n & 1) // 如果n是奇数return false;stack<char> st;for (int i = 0; i < n; ++i) {if (A[i] == '(') {st.push('(');} else if (A[i] == ')' && !st.empty()) {if (st.top() == '(')st.pop();elsereturn false;} elsereturn false;}return true;}
};

Day_08

选了B。。。。。。。。。???????


选了3,。。。。。怎么选的这么少。。


选了A。。。。友元函数重载运算符。。。。。


牛客WY20 两种排序方法

两种排序方法_牛客题霸_牛客网

#include <iostream>
#include <vector>
using namespace std;
int main()
{int n = 0;cin >> n;vector<string> v(n);for (int i = 0; i < n; ++i) {cin >> v[i];}bool flag_lex = true, flag_len = true;for (int i = 0; i < n - 1; ++i) {if (v[i] > v[i + 1])flag_lex = false;if (v[i].size() > v[i + 1].size())flag_len = false;}if (flag_lex && flag_len)cout << "both";else if (flag_lex)cout << "lexicographically";else if (flag_len)cout << "lengths";elsecout << "none";return 0;
}

牛客_求最小公倍数

求最小公倍数__牛客网

#include <iostream>
using namespace std;
int main()
{long long a = 0, b = 0, c = 0;cin >> a >> b;if(a < b)swap(a,b);long long x = a * b;while (c = a % b){a = b;b = c;}cout << x / b;return 0;
}

Day_09

选了D.........


纠结地选了A,const 静态数据成员可以在类内初始化。。。



选了D。。。只能在栈上创建的才没很好的办法做到。


力扣+牛客另类加法

面试题 17.01. 不用加号的加法

class Solution {
public:int add(int a, int b) {while(b != 0){int c = ((b & a) << 1); // 进位a ^= b; // 无进位相加b = c; }return a;}
};

另类加法__牛客网

class UnusualAdd {public:int addAB(int A, int B) {while (B != 0) {int C = ((B & A) << 1); // 进位A ^= B; // 无进位相加B = C; // 直到进位不为0就跳出循环}return A;}
};

牛客HJ91 走方格的方案数

走方格的方案数_牛客题霸_牛客网

#include <iostream>
#include <vector>
using namespace std;
int pash(int n, int m)
{if (n == 1 || m == 1)return 1;elsereturn pash(n - 1, m) + pash(n, m - 1);
}
int main() 
{int n = 0, m = 0;cin >> n >> m;n += 1;m += 1;vector<vector<int>> arr(n, vector<int>(m, 1));for (int i = 1; i < n; ++i){for (int j = 1; j < m; ++j){arr[i][j] = arr[i - 1][j] + arr[i][j - 1];}}cout << arr[n - 1][m - 1];// cout << pash(n + 1, m + 1); // 法二...这题目描述 +1?return 0;
}

Day_10

以为报错,选了A,强转了所以没报错。。。。。。


牛客_井字棋

井字棋__牛客网

class Board {public:bool checkWon(vector<vector<int> > board) {// 当前玩家是否胜出!!!不是有玩家胜出int row = board.size(), col = board[0].size();for (int i = 0, cnt = 0; i < row; ++i) { // 每行for (int j = 0; j < col; ++j)cnt += board[i][j];// if (cnt == col || cnt == -col)// 当前玩家是否胜出!!!不是有玩家胜出if (cnt == col)return true;}for (int i = 0, cnt = 0; i < col; ++i) { // 每列for (int j = 0; j < row; ++j)cnt += board[i][j];// if (cnt == row || cnt == -row)// 当前玩家是否胜出!!!不是有玩家胜出if (cnt == row)return true;}int cnt = 0;for (int i = 0; i < row; ++i) {cnt += board[i][i];}// if (cnt == row || cnt == -row)// 当前玩家是否胜出!!!不是有玩家胜出if (cnt == row)return true;cnt = 0;for (int i = 0; i < row; ++i) {cnt += board[i][row - 1 - i];}// if (cnt == row || cnt == -row)// 当前玩家是否胜出!!!不是有玩家胜出if (cnt == row)return true;return false;}
};

牛客HJ87 密码强度等级

密码强度等级_牛客题霸_牛客网

题目描述

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

一、密码长度:
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的密码

输出描述:

输出密码等级

#include <cctype>
#include <iostream>
#include <string>
using namespace std;
int level(string str)
{int ret = 0;int n = str.size(); // 长度if (n <= 4)ret += 5;else if (n >= 5 && n <= 7)ret += 10;elseret += 25;//cout << "长度" << n << "分数" << ret << endl;int low = 0, gre = 0, cnt0 = 0; // 0字母for (auto& e : str) {if (islower(e))++low;else if (isupper(e))++gre;cnt0 = low + gre;}if (low && gre == 0)ret += 10;else if (gre && low == 0)ret += 10;else if (gre && low)ret += 20;int cnt1 = 0; // 1数字for (auto& e : str) {if (isdigit(e))++cnt1;}if (cnt1 == 1)ret += 10;else if (cnt1 > 1)ret += 20;int cnt2 = 0; // 2符号for (auto& e : str){if (e >= 0x21 && e <= 0x2F|| e >= 0x3A && e <= 0x40|| e >= 0x5B && e <= 0x60|| e >= 0x7B && e <= 0x7E)++cnt2;}if (cnt2 == 1)ret += 10;else if (cnt2 > 1)ret += 25;if (low && gre && cnt1 && cnt2) // 加分ret += 5;else if (cnt0 && cnt1 && cnt2)ret += 3;else if (cnt0 && cnt1)ret += 2;return ret;
}int main()
{string str;cin >> str;int res = level(str);//cout << res;if (res >= 90)cout << "VERY_SECURE";else if (res >= 80)cout << "SECURE";else if (res >= 70)cout << "VERY_STRONG";else if (res >= 60)cout << "STRONG";else if (res >= 50)cout << "AVERAGE";else if (res >= 25)cout << "WEAK";elsecout << "VERY_WEAK";return 0;
}

Day_11

选了B,数组指针,且还没指向。


选了C,语法没问题,但不推荐


牛客CM24 最近公共祖先

最近公共祖先_牛客题霸_牛客网

class LCA {
public:int getLCA(int a, int b) {// 左孩 = 父 * 2 + 1,右孩 = 父 * 2 + 2;// 父 = (孩 - 1) / 2;// 1 2 3// int a_f = a , b_f = b;int a_f = a - 1, b_f = b - 1; // 让其对应平时的下标while (a_f != b_f){if (a_f > b_f) // 让大的找自己的父结点{a_f = (a_f - 1) / 2;}else{b_f = (b_f - 1) / 2;}}// return a_f;return a_f + 1;}
};

牛客HJ86 求最大连续bit数

求最大连续bit数_牛客题霸_牛客网

#include <iostream>
using namespace std;
int main()
{int n = 0, cnt = 0, ret = 0;cin >> n;for (int i = 0; i < 32; ++i){if (n & (1 << i)) // 如果是1就计数{++cnt;}else // 如果是0就更新结果,且重新计数{ret = max(ret, cnt);cnt = 0;}}cout << ret;return 0;
}

Day_12

选了A?,B可以通过类域


引用!!以为是拷贝构造,选了C


选了A!!!!!!!!脑子瓦特了


选了B,可以私有+只声明 或者用delete,那天脑子真瓦特了


选了D。。。。。。。。。寄!!!!!!!


牛客CM26 二进制插入

二进制插入_牛客题霸_牛客网

class BinInsert {
public:int binInsert(int n, int m, int j, int i) {// 1 2 4 8 16 32 64 128 256 512 1014// 1024 + 2 + 4 + 32 =// 1024 + 4 + 8 + 64 = 1024 + 76// 10000000000// 10011// 10001001100return n |= (m << j); // 法1//for (int k = j; k <= i; ++k) // 法2//{//	if (m & 1)//	{//		n |= (1 << k);//	}//	m >>= 1;//}// return n;}
};

牛客HJ60 查找组成一个偶数最接近的两个素数

查找组成一个偶数最接近的两个素数_牛客题霸_牛客网

#include <cmath>
#include <iostream>
using namespace std;
bool isPrime(int n)
{for (int i = 2; i <= sqrt(n); ++i){if (n % i == 0){return false;}}return true;
}
int main()
{int n = 0;cin >> n;for (int i = n / 2; i < n; ++i){if (isPrime(i) && isPrime(n - i)){cout << n - i << endl << i;return 0;}}return 0;
}


Day_13

...最后两个函数调用是B调用的。


声明纯虚函数的类是抽象类。


只有4对,2是8


编译器有优化,注意有两次析构。


牛客HJ74 参数解析

参数解析_牛客题霸_牛客网

解析代码1

#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{string str = "";getline(cin, str);vector<string> res;if (str.size() == 0 || str[0] == ' ')return 0;string tmp;for (int i = 0; i < str.size(); ++i){if(str[i] == '"'){while(str[++i] != '"'){tmp += str[i];}res.push_back(tmp);tmp = "";i++; // 跳过一个双引号后的空格}else if (str[i] != ' '){tmp += str[i];}else{res.push_back(tmp);tmp = "";}}if(!tmp.empty())res.push_back(tmp);cout << res.size() << endl;;for (auto& e : res){cout << e << endl;}return 0;
}

解析代码2

#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{string str = "";getline(cin, str);vector<string> res;if (str.size() == 0 || str[0] == ' ')return 0;string tmp;bool flag = false;for (int i = 0; i < str.size(); ++i){if(str[i] == '"') // 如果是双引号,让标志换值{flag = !flag;}else if (str[i] != ' ' || flag) {tmp += str[i];}else{res.push_back(tmp);tmp = "";}}if(!tmp.empty())res.push_back(tmp);cout << res.size() << endl;;for (auto& e : res){cout << e << endl;}return 0;
}

牛客WY28 跳石板

跳石板_牛客题霸_牛客网

#include <iostream>
#include <vector>
#include <climits>
#include <cmath>
using namespace std;void get_div_num(int n, vector<int>& arr)
{for (int i = 2; i <= sqrt(n); ++i){if (n % i == 0) // i是约数{arr.push_back(i);if (n / i != i) // 另一个大的约数arr.push_back(n / i);}}
}
int Jump(int n, int m)
{vector<int> step(m + 1, INT_MAX);// 存放到达这个位置的最少步数,int_max表示不可达到step[n] = 0; // 当前位置初始化for (int i = n; i < m; ++i){if (step[i] == INT_MAX)continue;// 获取i的约数,并保存到arrvector<int> arr;get_div_num(i, arr);for (int j = 0; j < arr.size(); ++j){if (arr[j] + i <= m && step[arr[j] + i] != INT_MAX){	// 挑选一个最小值step[arr[j] + i] = min(step[arr[j] + i], step[i] + 1);}else if (arr[j] + i <= m && step[arr[j] + i] == INT_MAX){	// 更新不可到达的地方step[arr[j] + i] = step[i] + 1;}}}return step[m] == INT_MAX ? -1 : step[m];
}int main()
{int n = 0, m = 0, min_step = 0;while (cin >> n >> m){min_step = Jump(n, m);cout << min_step;}return 0;
}

Day_14



B:普通对象能调用const成员函数,const对象不能调用普通函数。

C:析构函数可以是虚函数,构造函数不可以是虚函数。


A:不严谨,是取地址符,不是引用操作符。

D:在类里弄一个函数返回new的对象,单例模式。。。。。。。


父类的I = 10 ,子类的func2 加等2 -> 12


静态。。


多态虚函数考得多,没复习。。。。。。。。。。


构造子类先调用父类构造函数。


牛客HJ73 计算日期到天数转换

计算日期到天数转换_牛客题霸_牛客网

#include <iostream>
using namespace std;
int main()
{int year = 0, month = 0, day = 0, sum = 0;cin >> year >> month >> day;static int arr[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};for (int i = 1; i < month; ++i){sum += arr[i];}// if (month > 2 && (year % 4 == 0 && year % 400 != 0))if (month > 2 && ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)){++sum;}cout << sum + day;return 0;
}

WY15 幸运的袋子

幸运的袋子_牛客题霸_牛客网

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;int getLuckyBag(const vector<int>& v, int pos, int sum, int mul)
{int count = 0;for (int i = pos; i < v.size(); i++){sum += v[i];mul *= v[i];if (sum > mul) //只有数据有1的时候才可能sum>mulcount += 1 + getLuckyBag(v, i + 1, sum, mul);else if (v[i] == 1) // 如果不幸运,并且当前值为1(数据只有1才会这样)count += getLuckyBag(v, i + 1, sum, mul);elsebreak;sum -= v[i];mul /= v[i];while (i < v.size() - 1 && v[i] == v[i + 1]){	// 处理重复问题i++;}}return count;
}int main()
{int n = 0;cin >> n;vector<int> v;v.reserve(n);for (int i = 0;i < n;i++){int j = 0;cin >> j;v.push_back(j);}sort(v.begin(), v.end());cout << getLuckyBag(v, 0, 0, 1);
}


Day_15

构造子类,先调用父类构造函数。



A foo不是虚函数



牛客HJ62 查找输入整数二进制中1的个数

查找输入整数二进制中1的个数_牛客题霸_牛客网

#include <iostream>
using namespace std;
int main()
{int n = 0;while (cin >> n){int cnt = 0;while (n != 0){n &= (n - 1);++cnt;}cout << cnt << endl;}return 0;
}

牛客OR57 手套

手套_牛客题霸_牛客网

class Gloves {
public:int findMinimum(int n, vector<int> left, vector<int> right) {int ret = 0;int left_cnt = 0, right_cnt = 0;int left_min = INT_MAX, right_min = INT_MAX;for (int i = 0; i < n; ++i){if (left[i] == 0){ret += right[i];}else if (right[i] == 0){ret += left[i];}else{left_cnt += left[i];right_cnt += right[i];left_min = min(left[i], left_min);right_min = min(right[i], right_min);}}ret += min(left_cnt - left_min, right_cnt - right_min);return ret + 2; // 全部情况拿完,再左右各拿一个}
};

Day_16


C:多态?


B私有继承C。。。。。。


FuncA不是虚函数。


父类指针调用父。


牛客HJ56 完全数计算

完全数计算_牛客题霸_牛客网

#include <cmath>
#include <iostream>
using namespace std;
bool isPerfect(int n)
{int sum = 1; // 先把1加上for (int i = 2; i <= sqrt(n); ++i){if (n % i == 0){sum += i;if (n / i != i)sum += n / i;}}return sum == n;
}
int main()
{int n = 0, cnt = 0;cin >> n;for (int i = 2; i <= n; ++i){if (isPerfect(i))++cnt;}cout << cnt;return 0;
}

牛客OR44 扑克牌大小

扑克牌大小_牛客题霸_牛客网

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;string FindMax(const string& line)
{if (line.find("joker JOKER") != string::npos)return "joker JOKER";int dash = line.find('-');// 分开两手牌string car1 = line.substr(0, dash);string car2 = line.substr(dash + 1);// 获取两手牌的张数int car1_cnt = count(car1.begin(), car1.end(), ' ') + 1;int car2_cnt = count(car2.begin(), car2.end(), ' ') + 1;// 获取两手牌的各自第一张牌string car1_first = car1.substr(0, car1.find(' '));string car2_first = car2.substr(0, car2.find(' '));if (car1_cnt == car2_cnt) // 两手牌的类型相同{string str = "345678910JQKA2jokerJOKER";if (str.find(car1_first) > str.find(car2_first))return car1;return car2;}if (car1_cnt == 4) // 说明是炸弹return car1;else if (car2_cnt == 4)return car2;return "ERROR";
}int main()
{string line = "";getline(cin, line);cout << FindMax(line) << endl;return 0;
}


Day_17

内联函数不能成为虚函数。


继承主要用来实现多态,多态靠的是虚函数。


先析构子类,后析构父类


牛客_计算某字符出现次数

计算某字符出现次数_牛客题霸_牛客网

#include <cctype>
#include <iostream>
#include <string>
using namespace std;
int main()
{string str;getline(cin, str);char c;cin >> c;if (islower(c)) // 全部小写字母转大写{c -= 32;}int cnt = 0;for (auto& e : str){if (islower(e))e -= 32;if (e == c)++cnt;}cout << cnt;return 0;
}

杨辉三角的变形

杨辉三角的变形_牛客题霸_牛客网

解法1(超出内存限制)

#include <iostream>
#include <vector>
using namespace std;
int main()
{int n = 0;cin >> n;vector<vector<int>> vv(n);for (int i = 0; i < n; ++i){vector<int> tmp(i + 1, 1);vv[i] = tmp;}for (int i = 2; i < n; ++i){for (int j = 1; j < i + 1; ++j) // 只需填到中间{if (j == 1) // 第二列vv[i][j] = vv[i - 1][j] + vv[i - 1][j - 1];else if (j == i) // 最后中间列(最后一列)vv[i][j] = vv[i - 1][j - 1] + vv[i - 1][j - 2] * 2;elsevv[i][j] = vv[i - 1][j] + vv[i - 1][j - 1] + vv[i - 1][j - 2];}}// for(int i = 0; i < n; ++i)// {// for(int j = 0; j < vv[i].size(); ++j)// {// cout << vv[i][j] << ' ';// }// cout << endl;// }int len = vv[n - 1].size();for (int i = n - 1, j = 1; j < len; ++j){if (vv[i][j] % 2 == 0){cout << j + 1;return 0;}}cout << -1;return 0;
}

解法2(找规律)

#include <iostream>
using namespace std;
int main()
{int n = 0;cin >> n;if (n <= 2)cout << -1;else if (n % 4 == 1 || n % 4 == 3)cout << 2;else if (n % 4 == 2)cout << 4;elsecout << 3;return 0;
}

Day_18

插入和删除都有可能导致迭代器失效

程序崩溃


牛客HJ37 统计每个月兔子的总数

统计每个月兔子的总数_牛客题霸_牛客网

#include <iostream>
#include <vector>using namespace std;
int main()
{int n = 0;cin >> n;vector<int> arr(n + 1, 0);arr[1] = 1, arr[2] = 1, arr[3] = 2; // 3 5int cnt = 1; // 下一月会生的for (int i = 4; i <= n; ++i){arr[i] = arr[i - 1] + cnt;cnt = arr[i - 1];}// for(auto& e : arr)// {// cout << e << ' ';// }// cout << endl;cout << arr[n];return 0;
}

HJ71 字符串通配符

描述

问题描述:在计算机中,通配符一种特殊语法,广泛应用于文件搜索、数据库、正则表达式等领域。现要求各位实现字符串通配符的算法。

要求:
实现如下2个通配符:
*:匹配0个或以上的字符(注:能被*和?匹配的字符仅由英文字母和数字0到9组成,下同)
?:匹配1个字符

注意:匹配时不区分大小写。

输入:
通配符表达式;
一组字符串。

输出:

返回不区分大小写的匹配结果,匹配成功输出true,匹配失败输出false

数据范围:字符串长度:1≤s≤100 1≤s≤100 

进阶:时间复杂度:O(n2),空间复杂度:O(n) 

输入描述:

先输入一个带有通配符的字符串,再输入一个需要匹配的字符串

输出描述:

返回不区分大小写的匹配结果,匹配成功输出true,匹配失败输出false

抄的代码(写题时直接在ture和false返回一个了)

#include <iostream>
#include <string>
using namespace std;bool match(const char* pattern, const char* str)
{if (*pattern == '\0' && *str == '\0')return true; // 当前字符结束,返回trueif (*pattern == '\0' || *str == '\0')return false; // 两个字符串有一个先结束,则返回falseif (*pattern == '?') // 新增用例,题目强调?只能够匹配数字和字母,所以增加新的判断{if (!isdigit(*str) && !isalpha(*str))return false;return match(pattern + 1, str + 1); // 遇到?号,匹配一个字符,跳过一个位置}else if (*pattern == '*'){while (*pattern == '*'){pattern++; // 遇到*号,(str不挪动),1个(两者都向前挪动一个字符)或多个(str向前挪动一个字符)}pattern--;if (!isdigit(*str) && !isalpha(*str))return match(pattern + 1, str);return match(pattern + 1, str) || match(pattern + 1, str + 1) || match(pattern, str + 1);}else if (tolower(*pattern) == tolower(*str)) // 忽略大小写{return match(pattern + 1, str + 1); // 如果当前字符相等,匹配下一个字符}return false;
}int main()
{string pattern, str;while (cin >> pattern >> str){bool ret = match(pattern.c_str(), str.c_str());if (ret)cout << "true" << endl;elsecout << "false" << endl;}return 0;
}


Day_19

汽水瓶_牛客题霸_牛客网

#include <iostream>
using namespace std;
int main()
{int empty = 0;while (cin >> empty){if (empty == 0)break;int sum = 0;while (empty > 1){int res = empty / 3; //所能兑换的个数int left = empty % 3; //遗下的个数sum += res;empty = left + res;if (empty == 2){sum++;break;}}cout << sum << endl;}return 0;
}
#include <iostream>
using namespace std;
int main()
{int empty = 0;while (cin >> empty){if (empty > 2) // 取巧cout << empty / 2 << endl;}return 0;
}

HJ65 查找两个字符串a,b中的最长公共子串

查找两个字符串a,b中的最长公共子串_牛客题霸_牛客网

#include <iostream>
#include <string>
#include <vector>
using namespace std;string getComSubstr(string& str1, string& str2) // 寻求最短字符串
{if (str1.size() > str2.size())swap(str1, str2);int len1 = str1.size();int len2 = str2.size();vector<vector<int>> MSC(len1 + 1, vector<int>(len2 + 1, 0));int start = 0, max_size = 0;for (int i = 1; i <= len1; ++i){for (int j = 1; j <= len2; ++j){if (str2[j - 1] == str1[i - 1])MSC[i][j] = MSC[i - 1][j - 1] + 1;if (MSC[i][j] > max_size){max_size = MSC[i][j];start = i - max_size;}}}return str1.substr(start, max_size);
}int main()
{string str1, str2;while (cin >> str1 >> str2){string substr = getComSubstr(str1, str2);cout << substr << endl;}return 0;
}

Day_20

以为中序遍历是有序的,乱选的。。。。。。。。。


看那两个是拍排好的,是关键字。

牛客HJ12 字符串反转

字符串反转_牛客题霸_牛客网

#include <iostream>
using namespace std;
int main()
{string str = "";cin >> str;int left = 0, right = str.size() - 1;while (left < right){char tmp = str[left];str[left] = str[right];str[right] = tmp;++left;--right;}cout << str;return 0;
}

HJ75 公共子串计算

公共子串计算_牛客题霸_牛客网

#include <iostream>
using namespace std;
int main()
{string str1 = "", str2 = "";cin >> str1 >> str2;int n1 = str1.size(), n2 = str2.size();int res = -1;for (int i = 0; i < n1; ++i){for (int j = 0; j < n2; ++j){int cnt = 0;int tmpi = i, tmpj = j;while (tmpi < n1 && tmpj < n2 && str1[tmpi++] == str2[tmpj++]){++cnt;}res = max(res, cnt);}}cout << res << endl;return 0;
}

Day_21

牛客WY24 洗牌

洗牌_牛客题霸_牛客网

#include <iostream>
#include <vector>
using namespace std;int main()
{int T = 0;cin >> T;while (T--){int n = 0, k = 0;cin >> n >> k;vector<int> arr(2 * n, 0);for (int i = 0; i < 2 * n; ++i){cin >> arr[i];}while (k--){vector<int> tmp1(arr.begin(), arr.begin() + n);vector<int> tmp2(arr.begin() + n, arr.end());for (int i = 0, j = 0; i < n; ++i){arr[j++] = tmp1[i];arr[j++] = tmp2[i];}}for (auto& e : arr){cout << e << " ";}cout << endl;}return 0;
}

MP3光标位置

​​​​​​​MP3光标位置_牛客题霸_牛客网

#include <iostream>
#include <string>
using namespace std;int main()
{int n = 0;string cmd;while (cin >> n >> cmd){// 将n首歌进行编号1:n,其中num代表当前光标所在的歌曲编号// first代表当前页的第一首歌曲的编号int num = 1, first = 1;if (n <= 4) // 歌曲总数 <= 4{for (int i = 0; i < cmd.size(); ++i) // 解析命令{if (num == 1 && cmd[i] == 'U')num = n;else if (num == n && cmd[i] == 'D')num = 1;else if (cmd[i] == 'U')num--;elsenum++;}for (int i = 1; i <= n; ++i){cout << i << " ";}cout << endl;cout << num << endl;}else // 歌曲总数 > 4{for (int i = 0; i < cmd.size(); ++i) // 解析命令{if (first == 1 && num == 1 && cmd[i] == 'U'){first = n - 3; // 将first跳入最后一页num = n;}else if (first == n - 3 && num == n && cmd[i] == 'D'){first = num = 1;}else if (first != 1 && num == first && cmd[i] == 'U'){first--;num--;}else if (first != n - 3 && num == first + 3 && cmd[i] == 'D'){first++;num++;}else if (cmd[i] == 'U'){num--;}else{num++;}}for (int i = first; i <= first + 3; ++i){cout << i << " ";}cout << endl;cout << num << endl;}}return 0;
}

​​​​​​​


Day_22

是判断p指针是不是尾结点。。。。。。。不是插入p。

选的B,没看懂吧

选了1.5,有点蒙

编程题少写了个等号,25分没了,还被认定抄袭,鼓掌鼓掌鼓掌鼓掌鼓掌

小易的升级之路_牛客题霸_牛客网

#include <iostream>
#include <vector>
using namespace std;int getVal(int a, int b)
{if (a > b)swap(a, b);for (int i = a; i >= 1; --i){if (a % i == 0 && b % i == 0)return i;}return -1;
}int main()
{int n = 0, c = 0;while (cin >> n >> c){vector<int> arr(n);for (int i = 0; i < n; ++i){cin >> arr[i];}for (int i = 0; i < n; ++i){if (arr[i] <= c)c += arr[i];elsec += getVal(c, arr[i]);}cout << c << endl;}return 0;
}

找出字符串中第一个只出现一次的字符_牛客题霸_牛客网

#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;
int main() {string str = "";getline(cin, str);unordered_map<char, int> hash; // 字符和出现的次数for (auto& e : str) {hash[e]++;}string strOne = "";for (auto& e : hash) {if (e.second == 1) {strOne += e.first;}}
// cout << strOne << endl;for (auto& e : str) {for (auto& One : strOne) {if (One == e) {cout << e << endl;return 0;}}}cout << -1 << endl;return 0;
}

Day_23


QQ2微信红包(排序或摩尔投票法)

微信红包_牛客题霸_牛客网

class Gift {
public:int getValue(vector<int> gifts, int n) {int cnt = 0, ret = 0;//for (int i = 0; i < n; ++i) // 摩尔投票法//{//	if (cnt == 0)//	{//		ret = gifts[i];//	}//	else//	{//		ret == gifts[i] ? ++cnt : --cnt;//	}//}//cnt = 0;sort(gifts.begin(), gifts.end());ret = gifts[n / 2];for (auto& e : gifts){if (e == ret)++cnt;}if (cnt > n / 2)return ret;return 0;}
};

HJ52计算字符串的编辑距离(dp)

计算字符串的编辑距离_牛客题霸_牛客网

原代码:(可以在前面添加,此代码思路就错了)

#include <iostream>
#include <string>
using namespace std;
int main()
{string str1 = "", str2 = "";getline(cin, str1);getline(cin, str2);if (str1.size() > str2.size())swap(str1, str2);int n1 = str1.size(), n2 = str2.size();// cout << n1 << " " << n2 << endl;if (str1.empty()){cout << n2;return 0;}int cnt = 0;for (int i = 0; i < n2; ++i){if (i > n1 - 1){cnt += n2 - n1;break;}else{if (str1[i] != str2[i])++cnt;}}cout << cnt;return 0;
}

正解dp代码:

#include <iostream>
#include <string>
#include <vector>
using namespace std;int main()
{string str1 = "", str2 = "";cin >> str1 >> str2;int n1 = str1.size(), n2 = str2.size();// if(n1 == 0 || n2 == 0)// {//     cout << max(n1, n2);//     return 0;// }vector<vector<int>> dp(n1 + 1, vector<int>(n2 + 1));for(int i = 1; i <= n1; ++i){dp[i][0] = i;}for(int j = 1; j <= n2; ++j){dp[0][j] = j;}for(int i = 1; i <= n1; ++i){for(int j = 1; j <= n2; ++j){if(str1[i - 1] == str2[j - 1])dp[i][j] = dp[i - 1][j - 1];elsedp[i][j] = 1 + min(dp[i - 1][j - 1], min(dp[i - 1][j], dp[i][j - 1]));}}cout << dp[n1][n2] << endl;return 0;
}

Day_24

七层满的话就是2^7 - 1 = 127,减去9个叶节点的孩子就是127 - 2*9 = 109


JD1 年终奖(dp)

年终奖_牛客题霸_牛客网

小东所在公司要发年终奖,而小东恰好获得了最高福利,他要在公司年会上参与一个抽奖游戏,游戏在一个6*6的棋盘上进行,上面放着36个价值不等的礼物,每个小的棋盘上面放置着一个礼物,他需要从左上角开始游戏,每次只能向下或者向右移动一步,到达右下角停止,一路上的格子里的礼物小东都能拿到,请设计一个算法使小东拿到价值最高的礼物。

给定一个6*6的矩阵board,其中每个元素为对应格子的礼物价值,左上角为[0,0],请返回能获得的最大价值,保证每个礼物价值大于100小于1000。

class Bonus {
public:
int getMost(vector<vector<int> > board) {int m = board.size(), n = board[0].size();vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));for(int i = 1; i <= m; ++i){for(int j = 1; j <= n; ++j){dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) + board[i - 1][j - 1];}}return dp[m][n];}
};

HJ43 迷宫问题(dfs+回溯)

迷宫问题_牛客题霸_牛客网

#include <iostream>
#include <vector>
#include <queue>
using namespace std;vector<pair<int,int>> path, res;
bool vis[13][13];
int m, n;
int dx[4] = {0, 0, -1, 1};
int dy[4] = {1, -1, 0, 0};void dfs(vector<vector<int>>& vv, int sr, int sc)
{path.push_back({sr, sc});vis[sr][sc] = true;if(sr == m - 1 && sc == n - 1){res = path; // 一定要保存一下结果return;}queue<pair<int, int>> q;for(int j = 0; j < 4; ++j){int x = sr + dx[j], y = sc + dy[j];if(x >= 0 && x < m && y >= 0 && y < n && !vis[x][y] && vv[x][y] == 0){dfs(vv, x, y);}}path.pop_back(); // 回溯vis[sr][sc] = false;
}int main()
{cin >> m >> n;vector<vector<int>> vv(m, vector<int>(n, 0));for(int i = 0; i < m; ++i){for(int j = 0; j < n; ++j){cin >> vv[i][j];}}dfs(vv, 0, 0);for(auto [a, b] : res){cout << '(' << a << ',' << b << ')' << endl;}return 0;
}

http://www.xdnf.cn/news/596.html

相关文章:

  • 图解MCP:Model Context Protocol
  • 从零开始用Pytorch实现LLaMA 4的混合专家(MoE)模型
  • 【Java】接口interface学习
  • 国际数据加密算法(IDEA)详解
  • CentOS 10 /root 目录重新挂载到新分区槽
  • 【数据结构入门训练DAY-18】信息学奥赛一本通T1331-后缀表达式的值
  • URLDNS链构造
  • Android Studio 中 Drawable 详细全解
  • Android Drawable 目录下的 XML 图形文件详解
  • 在 Linux 上部署 .NET Core 应用并配置为开机自动启动
  • [操作系统] 信号
  • GO语言入门:常用数学函数2
  • rollup使用讲解
  • JUC复习及面试题学习
  • SpringBoot 统一功能处理
  • 智谱开源新一代GLM模型,全面布局AI智能体生态
  • 墙面刷完乳胶漆之后就有裂缝,有根治的办法吗?
  • Java面向对象进阶
  • BEVDet: High-Performance Multi-Camera 3D Object Detection in Bird-Eye-View
  • 年化26.9%的稳健策略|polars重构因子计算引擎(python策略下载)
  • AI——神经网络以及TensorFlow使用
  • 《汽车理论》第四章作业MATLAB部分
  • 传统深度学习架构和Transformer结构的区别
  • 从0开始搭建一套工具函数库,发布npm,支持commonjs模块es模块和script引入使用
  • uniapp-商城-29-vuex 关于系统状态的管理
  • 嵌入式单片机开发问题:Undefined symbol _HAL_RCC_GPIOB_CLK_ENABLE
  • Matlab 基于模型参考自适应法和SVPWM的异步电机控制
  • Kubernetes(k8s)学习笔记(二)--k8s 集群安装
  • 机器学习(神经网络基础篇)——个人理解篇6(概念+代码)
  • 【实战中提升自己】内网安全部署之dot1x部署 本地与集成AD域的主流方式(附带MAC认证)