每日刷题-5

目录

一、选择题

二、算法题

1、不要二

2、把字符串转换成整数


一、选择题

1、

解析:printf(格式化串,参数1,参数2,.....),格式化串: printf第一个参数之后的参数要按照什么格式打印,比如 %d--->按照整形方式打印,不过格式串有一定规定,%之后跟上特定的字符才代表一定的格式化。%Q--->无效的格式--->编译器会忽略%,printf("%Q");--->直接输出Q。

所以printf("%%%%\n");会输出%%。

2、

解析:这个程序使用了一个宏定义 SQR(A),用来计算一个表达式的平方。但是,这个宏定义有一个问题,就是没有用括号把 A 包起来,导致在使用宏展开时,可能会出现优先级的错误

所以SQR(y+z) 实际上被展开为 y+zy+z,而不是 (y+z)(y+z)。随后计算可得到x的值为0。

3、

解析:这个函数是一个递归函数,也就是说它会调用自身来计算结果。这个函数的逻辑是,如果 n 小于 2,就返回 n 本身,否则就返回 2 倍的 foo(n-1) 加上 foo(n-2)。我们先算出f(0)=0, f(1)=1,然后把f(5)变成由f(0),f(1)组成的表达式,就可以计算出答案。

二、算法题

1、不要二

题目解析:从题目里我们知道,如果(x1,y1)放了蛋糕,则满足 ( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) ) == 4的(x2,y2)不能放蛋糕。

( (x1-x2) * (x1-x2) + (y1-y2) * (y1-y2) ) == 4看起来是一个无解的表达式。
但是我们可以进行加法表达式分解:1+3=4,3+1=4,2+2=4,0+4=4,4+0=4

仔细分析前三个表达式是不可能的,因为(x1-x2) * (x1-x2)表达式结果不能等于2或3。
也就是说( (x1-x2) * (x1-x2) 和(y1-y2) * (y1-y2) )两个表达式一个等于0,一个等于4。

仔细读理解了上面的题目解读,本题就非常简单了,使用vector<vector<int>>定义一个二维数组,resize开空间并初始化,每个位置初始化为1,表示当蛋糕,a[i][j]位置放蛋糕,则可以标记处a[i][j+2]和a[i+1][j]位置不能放蛋糕,遍历一遍二维数组,标记处不能放蛋糕的位置,统计也就统计出了当蛋糕的位置数。

cpp 复制代码
#include <iostream>
#include<vector>
using namespace std;

int main() {
    int W, H;
    while (cin >> W >> H) 
    {
        int count = 0;
        vector<vector<int>> v;
        v.resize(W);
        for (auto& e : v) {
            e.resize(H, 1);
        }
        for (int i = 0; i < W; i++) 
        {
            for (int j = 0; j < H; j++)
             {
                if (v[i][j] == 1) 
                {
                    count++;
                    if (i + 2 < W)
                    {
                        v[i + 2][j] = 0;
                    }
                    if (j+2 <H )
                    {
                        v[i][j+2]=0;
                    }
                }

            }
        }
        cout<<count;
    }

}

2、把字符串转换成整数

题目解析:本题本质是模拟实现实现C库函数atoi,不过参数给的string对象。

首先,判断字符串是否为空,如果为空,就返回 0。然后,判断字符串的第一个字符是否是 '+' 或 '-',如果是,就记录下符号,并把字符串去掉第一个字符。接着,遍历字符串的每一个字符,如果是数字,就把它转换成整数,并累加到结果中;如果不是数字,就返回 0。最后,根据符号,返回正数或负数。

str[i] - '0' 是一种把字符转换成整数的方法。它的原理是利用字符的 ASCII 码,也就是每个字符对应的一个数字。例如,字符 '0' 的 ASCII 码是 48,字符 '1' 的 ASCII 码是 49,以此类推,字符 '9' 的 ASCII 码是 57。

cpp 复制代码
class Solution {
public:
    int StrToInt(string str) 
    {
        if(str.empty())
        {
            return 0;
        }
        int sum=0;
        int sym=1;
        if(str[0]=='-')
        {
            sym=-1;
            str[0]='0';
        }
        if(str[0]=='+')
        {
            str[0]='0';
        }
        for(int i=0;i<str.size();++i)
        {
        if(str[i] < '0' || str[i] > '9')
        {
        sum = 0;
        break;
        }
        sum = sum *10 + str[i] - '0';
        }
        return sum*sym;
        
    }
};
相关推荐
pianmian11 小时前
python数据结构基础(7)
数据结构·算法
好奇龙猫3 小时前
【学习AI-相关路程-mnist手写数字分类-win-硬件:windows-自我学习AI-实验步骤-全连接神经网络(BPnetwork)-操作流程(3) 】
人工智能·算法
sp_fyf_20244 小时前
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-11-01
人工智能·深度学习·神经网络·算法·机器学习·语言模型·数据挖掘
香菜大丸4 小时前
链表的归并排序
数据结构·算法·链表
jrrz08284 小时前
LeetCode 热题100(七)【链表】(1)
数据结构·c++·算法·leetcode·链表
oliveira-time4 小时前
golang学习2
算法
南宫生5 小时前
贪心算法习题其四【力扣】【算法学习day.21】
学习·算法·leetcode·链表·贪心算法
懒惰才能让科技进步6 小时前
从零学习大模型(十二)-----基于梯度的重要性剪枝(Gradient-based Pruning)
人工智能·深度学习·学习·算法·chatgpt·transformer·剪枝
Ni-Guvara6 小时前
函数对象笔记
c++·算法
泉崎6 小时前
11.7比赛总结
数据结构·算法