• 【大摆子 做 摆烂题】【C++】


    1. 把字符串转换成整数

    描述:将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为 0 或者字符串不是一个合法的数值则返回 0

    注意:

    ①字符串中可能出现任意符号,出现除 +/- 以外符号时直接输出 0

    ②字符串中可能出现 +/- 且仅可能出现在字符串首位。

    输入描述:输入一个字符串,包括数字字母符号,可以为空

    返回值描述:如果是合法的数值表达则返回该数字,否则返回0

    1.1 思路

    1. 其实也就是一位位把数字取下来然后再 加之前上一个数字 * 10

    2. 然后就是边界的判断,和正负号的处理

    1.2 代码实现

    1. class Solution {
    2. public:
    3. int StrToInt(string str) {
    4. if(str.empty())
    5. {
    6. return 0;
    7. }
    8. int falg = 1;
    9. int ret = 0;
    10. if(str[0] == '-')
    11. {
    12. falg = -1;
    13. str[0] = '0';
    14. }
    15. else if(str[0] == '+')
    16. {
    17. falg = 1;
    18. str[0] = '0';
    19. }
    20. for(size_t i = 0;i < str.size();i++)
    21. {
    22. if(str[i] < '0'|| str[i] > '9')
    23. {
    24. return 0;
    25. }
    26. ret = ret * 10 + str[i] - '0';
    27. }
    28. return falg * ret;
    29. }
    30. };

    2. 不要2

    描述:二货小易有一个W*H的网格盒子,网格的行编号为0~H-1,网格的列编号为0~W-1。每个格子至多可以放一块蛋糕,任意两块蛋糕的欧几里得距离不能等于2。
    对于两个格子坐标(x1,y1),(x2,y2)的欧几里得距离为:
    ( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) ) 的算术平方根
    小易想知道最多可以放多少块蛋糕在网格盒子里。

    输入描述:每组数组包含网格长宽W,H,用空格分割.(1 ≤ W、H ≤ 1000)

    输出描述:输出一个最多可以放的蛋糕数

    2.1 思路

    1.给个二维数组 初始化的时候把蛋糕就全部放好 也就是 == 1

    2.遍历一次二维数组把当前蛋糕对应不能放蛋糕的地方 == 0

    2.2 代码实现

    1. #include<iostream>
    2. #include<vector>
    3. using namespace std;
    4. int main()
    5. {
    6. vector<vector<int>> vv;
    7. int w = 0;
    8. int h = 0;
    9. int ret = 0;
    10. cin >> w >> h;
    11. vv.resize(w);
    12. for(auto &e : vv)
    13. {
    14. e.resize(h,1);
    15. }
    16. for(int i = 0;i < w;i++)
    17. {
    18. for(int j = 0;j < h;j++)
    19. {
    20. if(vv[i][j] == 1)
    21. {
    22. if((i + 2) < w)
    23. {
    24. vv[i + 2][j] = 0;
    25. }
    26. if((j + 2) < h)
    27. {
    28. vv[i][j + 2] = 0;
    29. }
    30. ret++;
    31. }
    32. }
    33. }
    34. cout << ret << endl;
    35. }

    3. 统计回文

    描述;“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。花花非常喜欢这种拥有对称美的回文串,生日的时候她得到两个礼物分别是字符串A和字符串B。现在她非常好奇有没有办法将字符串B插入字符串A使产生的字符串是一个回文串。你接受花花的请求,帮助她寻找有多少种插入办法可以使新串是一个回文串。如果字符串B插入的位置不同就考虑为不一样的办法。
    例如:A = “aba”,B = “b”。这里有4种把B插入A的办法:
            * 在A的第一个字母之前: "baba" 不是回文
            * 在第一个字母‘a’之后: "abba" 是回文
            * 在字母‘b’之后: "abba" 是回文
            * 在第二个字母'a'之后 "abab" 不是回文
            所以满足条件的答案为2

    输入描述:每组输入数据共两行。 第一行为字符串A 第二行为字符串B 字符串长度均小于100且只包含小写字母

    输出描述:输出一个数字,表示把字符串B插入字符串A之后构成一个回文串的方法数

    3.1 思路

    1. 先实现一个用双指针的方法检测此对象是不是回文。

    2. 每次插入后检测是否为回文,是的话count++ 。

    3.2 代码实现

    1. #include<iostream>
    2. #include<string>
    3. using namespace std;
    4. bool IsCircleText(const string& s)
    5. {
    6. int left = 0;
    7. int right = s.size() - 1;
    8. while(left < right)
    9. {
    10. if(s[left] == s[right])
    11. {
    12. ++left;
    13. --right;
    14. }
    15. else{
    16. return false;
    17. }
    18. }
    19. return true;
    20. }
    21. int main()
    22. {
    23. string s1;
    24. string s2;
    25. size_t count = 0;
    26. getline(cin,s1);
    27. getline(cin,s2);
    28. for(size_t i = 0;i <= s1.size();i++)
    29. {
    30. string s3 = s1;
    31. s3.insert(i, s2);
    32. if(IsCircleText(s3))
    33. {
    34. ++count;
    35. }
    36. }
    37. cout << count << endl;
    38. }

    4. 连续最大和

    描述:一个数组有 N 个元素,求连续子数组的最大和。 例如:[-1,2,1],和最大的连续子数组为[2,1],其和为 3

    输入描述:输入为两行。 第一行一个整数n(1 <= n <= 100000),表示一共有n个元素 第二行为n个数,即每个元素,每个整数都在32位int范围内。以空格分隔。

    输出描述:所有连续子数组中和最大的值。

    4.1 思路

    1. 直接给出状态转移很简单的dp    f(i)=max{f(i−1)+nums[i],nums[i]}

    2. 说人话就是还是找那个dp表---->也就是以i结尾子数组的连续最大和,因为可能我第i位就比你前面总和的大所以用一个max函数,ret返回值的更新也是用的max函数。

    4.2 代码实现

    1. #include<iostream>
    2. #include<vector>
    3. #include<algorithm>
    4. using namespace std;
    5. int main()
    6. {
    7. vector<int> v;
    8. int n = 0;
    9. cin >> n;
    10. v.resize(n);
    11. for(int i = 0;i < v.size();++i)
    12. {
    13. cin >> v[i];
    14. }
    15. int sum = 0;
    16. int ret = v[0];
    17. for(auto &e : v)
    18. {
    19. sum = max(e,e + sum);
    20. ret = max(ret,sum);
    21. }
    22. cout << ret <<endl;
    23. }

    5. 合法括号序列判断

    描述

    给定一个字符串A和其长度n,请返回一个bool值代表它是否为一个合法的括号串(只能由括号组成)。

    测试样例:"(()())",6  返回:true

    测试样例:"()a()()",7  返回:false

    测试样例:"()(()()",7  返回:false

    5.1 思路

    1. 牛客这个能简单点只是一个圆括号 那就左括号入栈 右括号查看栈顶元素是左括号则是匹配成功弹栈。

    2. 如果是右括号或者其他则是不匹配成功直接返回false。

    5.2 代码实现

    1. class Parenthesis {
    2. public:
    3. bool chkParenthesis(string A, int n) {
    4. // write code here
    5. stack<char> s;
    6. for(auto &e : A)
    7. {
    8. switch (e)
    9. {
    10. case '(':
    11. s.push('(');
    12. break;
    13. case ')':
    14. if(s.empty() || s.top() != '(')
    15. {
    16. return false;
    17. }
    18. else
    19. {
    20. s.pop();
    21. }
    22. break;
    23. default:
    24. return false;
    25. }
    26. }
    27. return true;
    28. }
    29. };

    6. 有效的括号

    给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。

    有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。

    输入:s = "()"
    输出:true

    输入:s = "()[]{}"
    输出:true

    输入:s = "(]"
    输出:false

    输入:s = "([)]"
    输出:false

    输入:s = "{[]}"
    输出:true
     

    6.1 思路

    1. 这比刚刚就多了两个括号只需要我们来判断一下就好了

    2.无非就是三种 

                    1. 栈为空 也就是全是左括号

                    2. 是左括号 弹出栈

                    3. 全部匹配完毕 栈为空

    6.2 代码实现

    1. class Solution {
    2. public:
    3. bool isValid(string s) {
    4. stack<char> sta;
    5. if(s.size() % 2 == 1)
    6. {
    7. return false;
    8. }
    9. for(auto &e : s)
    10. {
    11. switch(e)
    12. {
    13. case '(':
    14. sta.push(e);
    15. break;
    16. case '{':
    17. sta.push(e);
    18. break;
    19. case '[':
    20. sta.push(e);
    21. break;
    22. case ')':
    23. if(sta.empty() || sta.top() != '(')
    24. {
    25. return false;
    26. }
    27. else
    28. {
    29. sta.pop();
    30. }
    31. break;
    32. case '}':
    33. if(sta.empty() || sta.top() != '{')
    34. {
    35. return false;
    36. }
    37. else
    38. {
    39. sta.pop();
    40. }
    41. break;
    42. case ']':
    43. if(sta.empty() || sta.top() != '[')
    44. {
    45. return false;
    46. }
    47. else
    48. {
    49. sta.pop();
    50. }
    51. break;
    52. default:
    53. return false;
    54. }
    55. }
    56. return sta.empty();
    57. }
    58. };
    1. class Solution {
    2. public:
    3. bool isValid(string s) {
    4. stack<char> stk;
    5. if(s.empty()){
    6. return true;
    7. }
    8. for(const auto &c :s){
    9. if(c == '(' || c == '[' || c == '{'){
    10. stk.push(c);
    11. }
    12. else{
    13. if(stk.empty())
    14. {
    15. return false;
    16. }
    17. else
    18. {
    19. if(c == ')')
    20. {
    21. if(stk.top()!='(')
    22. {
    23. return false;
    24. }
    25. else
    26. {
    27. stk.pop();
    28. }
    29. }
    30. else if(c == ']')
    31. {
    32. if(stk.top() != '[')
    33. {
    34. return false;
    35. }
    36. else
    37. {
    38. stk.pop();
    39. }
    40. }
    41. else if(c=='}')
    42. {
    43. if(stk.top() != '{')
    44. {
    45. return false;
    46. }
    47. else
    48. {
    49. stk.pop();
    50. }
    51. }
    52. }
    53. }
    54. }
    55. return stk.empty();
    56. }
    57. };

    7. Fibonacci数列

    描述:Fibonacci数列是这样定义的:
    F[0] = 0
    F[1] = 1
    for each i ≥ 2: F[i] = F[i-1] + F[i-2]
    因此,Fibonacci数列就形如:0, 1, 1, 2, 3, 5, 8, 13, ...,在Fibonacci数列中的数我们称为Fibonacci数。给你一个N,你想让其变为一个Fibonacci数,每一步你可以把当前数字X变为X-1或者X+1,现在给你一个数N求最少需要多少步可以变为Fibonacci数。

    输入描述:输入为一个正整数N(1 ≤ N ≤ 1,000,000)

    输出描述:输出一个最小的步数变为Fibonacci数"

    7.1 思路 

    1.找到比N小且距离N最近的数,求出距离

    2.找到比N大且距离N最近的数,求出距离

    3.求最小

    7.2 代码实现

    1. #include <iostream>
    2. using namespace std;
    3. int main()
    4. {
    5. int N, f, l = 0,r = 0,f0 = 0,f1 = 1;
    6. cin >> N;
    7. while(1){
    8. f = f0 + f1;
    9. f0 = f1;
    10. f1 = f;
    11. if(f < N)
    12. {
    13. l = N-f;
    14. }
    15. else
    16. {
    17. r = f - N;
    18. break;
    19. }
    20. }
    21. cout << min(l,r) << endl;
    22. return 0;
    23. }
  • 相关阅读:
    洛谷-P7910 [CSP-J 2021]-插入排序(详细讲解)
    两台Linux机器scp不输密码
    第十七章《MySQL数据库及SQL语言简介》第3节:数据库管理
    [山东科技大学OJ]1487 Problem B: 编写函数:字符串的查找字符 之二 (Append Code)
    Linux用户管理与文件权限
    白杨SEO:SEO转型系列之十一,传统SEO从业人员如何转行社群运营/营销?
    vue集成百度地图vue-baidu-map
    2023年上半年系统集成项目管理工程师什么时候报考?(附具体报名步骤)
    微信公众号模板消息api
    wordpress 安装主题显示要配置FTP的解决办法
  • 原文地址:https://blog.csdn.net/qq_50119037/article/details/124942947