C/C++每日一练(20230311)

news2024/10/7 12:22:33

目录

1. 计算阶乘的和  ★

2. 基本计算器  ★★★

3. N皇后 II  ★★★

🌟 每日一练刷题专栏

C/C++ 每日一练 ​专栏

Python 每日一练 专栏


1. 计算阶乘的和

计算:1!-2!+3!-4!+5!-6!+7!-8!+9!-10!,并输出计算结果。

注意:不全是加法,而是 ∑ n! * (-1)^(n-1),加减混合的“代数和”。

代码:

#include "stdio.h"
double fun(int n)
{
    double sum=1.0;
    int i;
    for(i=1;i<=n;i++)
        sum*=i;
    return sum;
}

int main()
{
    int i,mark=1;
    double sum=0,item=0;
    for(i=1;i<=10;i++)
    {
        item=mark*fun(i);
        sum+=item;
        mark=-mark;
    }
    printf("1!-2!+3!-4!+5!-6!+7!-8!+9!-10! = %.0lf\n",sum);
    
    return 0;
}

输出:

1!-2!+3!-4!+5!-6!+7!-8!+9!-10! = -3301819


也可以不用像上面原题附带的代码一样自定义阶乘函数,其实只用一个循环就能搞定,非常简洁:

#include "stdio.h"

int main()
{
    long sum=0, fac=-1;
    for(int i=1;i<=10;i++)
    {
        fac *= -i;
        sum += fac;
    }
    printf("1!-2!+3!-4!+5!-6!+7!-8!+9!-10! = %ld\n", sum);
    
    return 0;
}


2. 基本计算器

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。

示例 1:

输入:s = "1 + 1"
输出:2

示例 2:

输入:s = " 2-1 + 2 "
输出:3

示例 3:

输入:s = "(1+(4+5+2)-3)+(6+8)"
输出:23

提示:

  • 1 <= s.length <= 3 * 10^5
  • s 由数字、'+''-''('')'、和 ' ' 组成
  • s 表示一个有效的表达式

代码: 

#include <bits/stdc++.h>
using namespace std;

class Solution
{
public:
    int calculate(string s)
    {
        stack<int> myStack;
        stack<char> myOperator;
        int i;
        for (i = 0; i < s.length(); i++)
        {
            while (i < s.length() && s[i] == ' ')
                i++;
            if (i == s.length())
                break;
            if (s[i] == '+' || s[i] == '-' || s[i] == '(')
                myOperator.push(s[i]);
            else if (s[i] == ')')
            {
                while (myOperator.top() != '(')
                {
                    int element1 = myStack.top();
                    myStack.pop();
                    int element2 = myStack.top();
                    myStack.pop();
                    char op = myOperator.top();
                    myOperator.pop();
                    if (op == '+')
                        myStack.push(element1 + element2);
                    else if (op == '-')
                        myStack.push(element2 - element1);
                }
                if (!myOperator.empty())
                    myOperator.pop();
                while (!myOperator.empty() && (myOperator.top() != '('))
                {
                    int element1 = myStack.top();
                    myStack.pop();
                    int element2 = myStack.top();
                    myStack.pop();
                    char op = myOperator.top();
                    myOperator.pop();
                    if (op == '+')
                        myStack.push(element1 + element2);
                    else if (op == '-')
                        myStack.push(element2 - element1);
                }
            }
            else
            {
                long long int number = 0;
                int j = i;
                while (j < s.length() && (s[j] - '0' <= 9) && (s[j] - '0' >= 0))
                {
                    number = number * 10 + (s[j] - '0');
                    j++;
                }
                i = j - 1;
                myStack.push(number);
                while (!myOperator.empty() && (myOperator.top() != '('))
                {
                    int element1 = myStack.top();
                    myStack.pop();
                    int element2 = myStack.top();
                    myStack.pop();
                    char op = myOperator.top();
                    myOperator.pop();
                    if (op == '+')
                        myStack.push(element1 + element2);
                    else if (op == '-')
                        myStack.push(element2 - element1);
                }
            }
        }
        return myStack.top();
    }
};

int main()
{
	Solution sol;
	string s = "1 + 1";
	cout << sol.calculate(s) << endl;
	
	s = "2-1 + 2";
	cout << sol.calculate(s) << endl;
	
	s = "(1+(4+5+2)-3)+(6+8)";
	cout << sol.calculate(s) << endl;

	return 0;
}

输出:

2
3
23


3. N皇后 II

n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

给你一个整数 n ,返回 n 皇后问题 不同的解决方案的数量。

示例 1:

输入:n = 4
输出:2
解释:如上图所示,4 皇后问题存在两个不同的解法。

示例 2:

输入:n = 1
输出:1

提示:

  • 1 <= n <= 9
  • 皇后彼此不能相互攻击,也就是说:任何两个皇后都不能处于同一条横行、纵行或斜线上。

代码:

#include <bits/stdc++.h>
using namespace std;

class Solution
{
public:
    int totalNQueens(int n)
    {
        vector<int> stack(n);
        return dfs(n, 0, stack);
    }
private:
    int dfs(int n, int row, vector<int> &stack)
    {
        int count = 0;
        if (row == n)
        {
            return count + 1;
        }
        else
        {
            for (int i = 0; i < n; i++)
            {
                if (row == 0 || !conflict(stack, row, i))
                {
                    stack[row] = i;
                    count += dfs(n, row + 1, stack);
                }
            }
            return count;
        }
    }
    bool conflict(vector<int> &stack, int row, int col)
    {
        for (int i = 0; i < row; i++)
        {
            if (col == stack[i] || abs(row - i) == abs(col - stack[i]))
            {
                return true;
            }
        }
        return false;
    }
};

int main()
{
	Solution sol;
	cout << sol.totalNQueens(4) << endl;
	cout << sol.totalNQueens(1) << endl;

	return 0;
}

输出:

2
1


附录

贪心算法

又称贪婪算法, greedy algorithm 
是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择。

一般步骤
①建立数学模型来描述问题 。
②把求解的问题分成若干个子问题 。
③对每个子问题求解,得到子问题的局部最优解 。
④把子问题的解局部最优解合成原来解问题的一个解 。

贪心算法是一种对某些求最优解问题的更简单、更迅速的设计技术。贪心算法的特点是一步一步地进行,常以当前情况为基础根据某个优化测度作最优选择,而不考虑各种可能的整体情况,省去了为找最优解要穷尽所有可能而必须耗费的大量时间。贪心算法采用自顶向下,以迭代的方法做出相继的贪心选择,每做一次贪心选择,就将所求问题简化为一个规模更小的子问题,通过每一步贪心选择,可得到问题的一个最优解。虽然每一步上都要保证能获得局部最优解,但由此产生的全局解有时不一定是最优的,所以贪心算法不要回溯 。

使用条件

利用贪心法求解的问题应具备如下2个特征:

1、贪心选择性质

一个问题的整体最优解可通过一系列局部的最优解的选择达到,并且每次的选择可以依赖以前作出的选择,但不依赖于后面要作出的选择。这就是贪心选择性质。对于一个具体问题,要确定它是否具有贪心选择性质,必须证明每一步所作的贪心选择最终导致问题的整体最优解。

2、最优子结构性质

当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。问题的最优子结构性质是该问题可用贪心法求解的关键所在。在实际应用中,至于什么问题具有什么样的贪心选择性质是不确定的,需要具体问题具体分析。

存在问题
贪心算法也存在如下问题:
1、不能保证解是最佳的。因为贪心算法总是从局部出发,并没从整体考虑 ;
2、贪心算法一般用来解决求最大或最小解 ;
3、贪心算法只能确定某些问题的可行性范围 。

应用实例

例如,平时购物找零钱时,为使找回的零钱的硬币数最少,不要求找零钱的所有方案,而是从最大面值的币种开始,按递减的顺序考虑各面额,先尽量用大面值的面额,当不足大面值时才去考虑下一个较小面值,这就是贪心算法。
有很多经典的应用,比如霍夫曼编码,普利姆和克鲁斯卡尔最小生成树算法,还有迪杰斯特拉单源最短路径算法,都是使用了这种思维。
(附录部分摘自百度百科)


🌟 每日一练刷题专栏

 持续,努力奋斗做强刷题搬运工!

👍 点赞,你的认可是我坚持的动力! 

 收藏,你的青睐是我努力的方向! 

✏️ 评论,你的意见是我进步的财富!  

C/C++ 每日一练 ​专栏

​​

Python 每日一练 专栏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/403560.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《数据分析-JiMuReport03》JiMuReport报表设计入门介绍-新建报表

报表设计 1 新建报表 1.1 创建新的数据报表 以数据报表为例&#xff0c;简单介绍创建报表的过程 1.2 进入报表设计页面 如下图可见&#xff0c;主要分为四个模块&#xff1a; 模块一(左) 数据集管理报表信息数据字典 模块二(右) 这部分是对数据报表的进一步优化 模块三(上…

Java面向对象:抽象类的学习

本文介绍了抽象类的基本语法概念,什么是抽象类. Java中抽象类的语法,抽象类的特性 抽象类的作用(抽象类和普通类的区别) 用抽象类实现多态… 抽象类的学习一.什么是抽象类二.抽象类语法三.抽象类的特性四.抽象类的作用五. 抽象类实现多态一.什么是抽象类 在面向对象的概念中&am…

Vue3与Vue2的区别以及Vue3的创建

Vue3带来了什么&#xff1f; 1.性能的提升 打包减少&#xff1b;初次渲染快&#xff1b;内存减少。 2.源码升级 使用Proxy代替defineProperty实现响应式&#xff1b; 重写虚拟DOM的实现和Tree-Shaking 3.使用了Typescript 4.新的特性 composition API 组合API setup配置 re…

深度学习训练营之yolov5训练自己的数据集

深度学习训练营之训练自己的数据集原文链接环境介绍准备好数据集划分数据集运行voc_train.py遇到问题完整代码创建new_data.yaml文件模型训练时遇到的报错模型训练结果可视化参考链接原文链接 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f…

【专项训练】红黑树和AVL树

红黑树和AVL树 平衡二叉树: AVL Tree,and so on 如何平衡? 如何记录高度 AVL:保证任何节点的平衡因子在[-1, 0, 1] 4种旋转操作:

Linux 练习八 (IPC 信号量)

文章目录信号量介绍信号量相关函数案例一&#xff1a;有亲缘关系的进程使用信号量通信案例二&#xff1a;无亲缘关系的进程使用信号量通信使用环境&#xff1a;Ubuntu18.04 使用工具&#xff1a;VMWare workstations &#xff0c;xshell作者在学习Linux的过程中对常用的命令进行…

记录--vue3+setup+ts 知识总结

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 vue3 于 2020 年 09 月 18 日正式发布&#xff0c;2022 年 2 月 7 日 vue3 成为新的默认版本 距离 vue3 正式发布已经过去两年有余, 成为默认版本也过去大半年了&#xff0c;以前还能说是对新技术、新…

SAP 凭证修改记录CDHDR / CDPOS使用及说明

目的&#xff1a; 一、sap的更改记录的保存 1、所有的修改记录在表CDHDR and CDPOS 2、表CDHDR 表CDHDR记录了用户于什么时间点用什么样的事务代码修改了什么样的对象 在表CDHDR字段&#xff1a;Change doc. Object代表了修改的对象 3、表CDPOS 是更改记录的行项目 记录…

web实现太极八卦图、旋转动画、定位、角度、坐标、html、css、JavaScript、animation

文章目录前言1、html部分2、css部分3、JavaScript部分4、微信小程序演示前言 哈哈 1、html部分 <div class"great_ultimate_eight_diagrams_box"><div class"eight_diagrams_box"><div class"eight_diagrams"><div class&…

如何使用MyBatis框架实现对数据库的增删查改?

目录&#xff1a;1.创建MyBatis项目以及如何配置2.MyBatis操作数据库的模式3.实现增删查改注意&#xff1a;在我们操作数据库之前&#xff0c;先要保证我们已经在数据库建好了一张表。创建MyBatis项目以及如何配置我们在创建项目的时候&#xff0c;引入MyBatis相关依赖配置数据…

动态内存分配之伙伴算法

伙伴算法 伙伴算法是一种在计算机内存管理中使用的算法&#xff0c;用于分配和释放内存。它是一种基于二叉树的动态内存分配算法&#xff0c;可以高效地分配和合并内存块。伙伴算法是一种按照固定大小分配内存的算法&#xff0c;例如&#xff0c;每个内存块的大小为2的n次幂&a…

MyBatis学习笔记(十二) —— MyBatis的逆向工程

12、MyBatis的逆向工程 正向工程&#xff1a;先创建Java实体类&#xff0c;由框架负责根据实体类生成数据库表。Hibernate是支持正向工程的。 逆向工程&#xff1a;先创建数据库表&#xff0c;由框架负责根据数据库表&#xff0c;反向生成如下资源&#xff1a; Java实体类Mappe…

操作系统--基于Linux的常用命令(超详细/设计/实验/作业/练习)

目录课程名&#xff1a;操作系统原理及Linux应用内容/作用&#xff1a;设计/实验/作业/练习学习&#xff1a;基于Linux的常用命令一、前言二、环境与设备三、原理四、内容五、总结与分析课程名&#xff1a;操作系统原理及Linux应用 内容/作用&#xff1a;设计/实验/作业/练习 …

苹果和富士康坚持推进印度制造,过于一厢情愿了,或加速衰退

在印度生产iPhone面临重重波折后&#xff0c;苹果和富士康仍然执意推进印度制造&#xff0c;这对于本已面临诸多风波的苹果来说并非好事&#xff0c;或许会加速苹果的衰退&#xff0c;毕竟如今的苹果早已没有当年的影响力了。一、苹果面临的问题苹果能成为智能手机市场的领导者…

【专项训练】排序算法

排序算法 非比较类的排序,基本上就是放在一个数组里面,统计每个数出现的次序 最重要的排序是比较类排序! O(nlogn)的3个排序,必须要会!即:堆排序、快速排序、归并排序! 快速排序:分治 经典快排 def quickSort1(arr

WinRAR安装教程

文章目录WinRAR安装教程无广告1. 下载2. 安装3. 注册4. 去广告WinRAR安装教程无广告 1. 下载 国内官网&#xff1a;https://www.winrar.com.cn/ 2. 安装 双击&#xff0c;使用默认路径&#xff1a; 点击“安装”。 点击“确定”。 点击“完成”。 3. 注册 链接&#xff…

第161篇 笔记-去中心化的含义

本文主要内容来自Vitalik Buterin的文章。“去中心化”这个词是在加密经济学领域用得最多的一个词&#xff0c;通常也作为辨别区块链的依据。然而&#xff0c;这个词也可能是被定义得最不恰当的一个词。数千小时的研究和价值数十亿美元哈希算力的投入都旨在实现去中心化&#x…

wsl ubuntu22.04 conda环境安装labelImg解决xcb缺失问题

labelImg 安装 pip install PyQt5 -i https://pypi.tuna.tsinghua.edu.cn/simple/ pip install pyqt5-tools -i https://pypi.tuna.tsinghua.edu.cn/simple/ pip install lxml -i https://pypi.tuna.tsinghua.edu.cn/simple/ pip install labelImg -i https://pypi.tuna.tsingh…

Java基础学习(2)

Java基础学习一 基础概念1.1 注释1.2 关键字1.3 字面量特殊字符1.4 变量1.5 数据类型1.6 标识符1.7 键盘输入二 运算符隐式转换强制转换三元运算符运算符的优先级二 源码 补码 反码2.1 源码2.2 反码2.3 补码其他运算符逻辑与逻辑或左移右移一 基础概念 1.1 注释 对自己所写的内…

HTML快速入门

目录HTML概念HTML基本格式基本语法常用标签1.文件标签&#xff1a;构成html最基本的标签2.文本标签&#xff1a;和文本有关的标签3.列表标签4.图片标签5.超链接标签6.表格标签7.表单标签HTML概念 HTML是最基础的网页开发语言&#xff0c;Hyper Text Markup Language&#xff0…