学大伟业 Day 3 培训总结

今天讲的字符串:

不多说,直接看题

一.表达式求值

题目大意:

输入一行一个表达式,计算其答案 表达式包含非负整数、加减乘除、括号

两种做法

·栈

·表达式树

这里更推荐表达式树,因为栈是先压进去,逆序操作。在进行逆序操作时即从右往左计算,实际应该是从左往右计算,所以会出现计算不符合顺序的问题。从而出现错误。

而表达式树则又称为“表达式目录树”,以数据形式表示语言级代码,它是一种抽象语法树或者说是一种数据结构。——摘自百度百科

可见,每个父节点都是一种运算符,子节点为数字。运算时从底层向上层依次按父节点符号操作子节点即可。

先贴的代码:

 1 /*
 2 1+(2+3)*4
 3 21
 4 */
 5
 6 #include <iostream>
 7 #include <stack>
 8 using namespace std;
 9
10 const int MAXN = 10000 + 10;
11 char str[MAXN];
12 stack<int> nums;
13 stack<char> symbol;
14
15 void pop()
16 {
17     int a = nums.top();nums.pop();
18     int b = nums.top();nums.pop();
19     char s = symbol.top();symbol.pop();
20     int ans;
21     switch(s)
22     {
23         case ‘+‘:ans=a+b;break;
24         case ‘-‘:ans=b-a;break;
25         case ‘*‘:ans=a*b;break;
26         case ‘/‘:ans=b/a;break;
27     }
28     nums.push(ans);
29 }
30 int main()
31 {
32     cin >> (str+1);
33     for(int i=1;str[i]!=0;i++)
34     {
35         char c=str[i];
36         if(‘0‘<=c&&c<=‘9‘)
37         {
38             nums.push(c-‘0‘);
39         } else {
40             if(c==‘)‘)
41             {
42                 while(symbol.top() != ‘(‘) pop();
43                 symbol.pop();
44             } else if (c==‘+‘ || c==‘-‘)
45             {
46                 while(!symbol.empty()
47                     &&symbol.top()!=‘+‘
48                     &&symbol.top()!=‘-‘
49                     &&symbol.top()!=‘(‘) pop();
50                 symbol.push(c);
51             } else symbol.push(c);
52         }
53     }
54     while(!symbol.empty())pop();
55     cout<<nums.top()<<endl;
56
57     return 0;
58 }

在计算上面图中的例子时,栈会出错。

下面给出表达式树的代码:

 1 /*
 2 10+(2+3)*4
 3 30
 4 */
 5
 6 #include <iostream>
 7 #include <stack>
 8 #include <cstring>
 9 using namespace std;
10
11 const int MAXN = 10000 + 10;
12 char str[MAXN];
13
14 int solve(int l, int r)
15 {
16
17     int pos=-1;
18     int flag=0;
19     int level=2; // 0:+- 1:*/
20     for(int i=l;i<=r;i++)
21     {
22         if(str[i]==‘(‘)flag++;
23         if(str[i]==‘)‘)flag--;
24         if(flag == 0 && (str[i]<‘0‘||str[i]>‘9‘||str[i]==‘+‘||str[i]==‘-‘||str[i]==‘*‘||str[i]==‘/‘)&&str[i]!=‘)‘)
25         {
26             int l=-1;
27             switch(str[i])
28             {
29                 case ‘+‘:case ‘-‘:l=0;break;
30                 case ‘*‘:case ‘/‘:l=1;break;
31             }
32             if(level >= l)
33             {
34                 level=l;
35                 pos=i;
36             }
37         }
38     }
39     if(pos==-1)
40     {
41         if(str[l]==‘(‘&&str[r]==‘)‘) return solve(l+1,r-1);
42         int x=0;
43         for(int i=l;i<=r;i++)
44             x=x*10+str[i]-‘0‘;
45         return x;
46     }
47     int a = solve(l, pos-1);
48     int b = solve(pos+1, r);
49     int ans;
50     switch(str[pos])
51     {
52         case ‘+‘:ans=a+b;break;
53         case ‘-‘:ans=a-b;break;
54         case ‘*‘:ans=a*b;break;
55         case ‘/‘:ans=a/b;break; // 3*2/3
56     }
57     return ans;
58 }
59 int main()
60 {
61     cin >> (str+1);
62     cout << solve(1, strlen(str+1)) << endl;
63
64     return 0;
65 }

二.字符串统计

题目大意:给定N个字符串,判断不同的字符串有多少个。

做法:hash

所谓hash就是把每个字符串设成一个值,每个字符串的值要不同,所以操作的时候只要弄的奇奇怪怪就好啦(个人理解,不喜勿喷)

这样比较字符串就成了比较数值的问题。

哈希碰撞:所谓哈希碰撞是指在哈希时难免会遇到有重复的数值,解决方案可以为双哈希。

例如:在哈希时会模一个很大的质数,假设这个质数为mod,当遇到某个数m时(m<mod)m % mod = m

但是当遇到另一个数n时,n恰巧为 m + mod 那么 n % mod = m 两串字符对应值都为m,产生了碰撞。

在洛谷有道模板题,链接:https://www.luogu.org/problemnew/show/P3370

hash代码如下:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 using namespace std;
 6 long n;
 7 char s[10001];
 8 long long ms[10101]={0};
 9 long long ans=1;
10
11 int main()
12 {
13     scanf("%d",&n);
14     for(int i=1;i<=n;i++)
15     {
16         cin>>s;
17
18         int len=strlen(s);
19         for(int j=0;j<len;j++)
20         ms[i]=(ms[i]*131+(long long)s[j])%233333333333+233317;
21
22     }
23         sort(ms+1,ms+n+1);
24     for(int i=1;i<n;i++)
25     {
26         if(ms[i]!=ms[i+1])
27         ans++;
28     }
29     printf("%d",ans);
30
31
32 }

原文地址:https://www.cnblogs.com/MisakaAzusa/p/8470377.html

时间: 2024-10-06 09:36:47

学大伟业 Day 3 培训总结的相关文章

学大伟业 Day 2 培训总结

一.dp 动态规划的本质 是一种思想.通过对原问题划分成子问题,寻找子问题之间的联系,通过求解子问题得出原问题的解.与贪心不同的是,动归是深谋远虑,考虑全局最优解:而贪心则目光短浅,只考虑局部最优解. 子问题 对应 状态 子问题之间的联系 对应 状态转移 边界子问题 对应 边界状态(状态转移的边界) 边界子问题:其结果不依赖其他子问题 求解动态规划类题目的要点 定义状态 寻找状态转移方程 边界状态 值得一提的是 动态规划中边界状态是可以由状态定义轻松得出 边界不能忽略. 动态规划的分类 按照常用

学大伟业 Day 6 培训总结

今天接着昨天的继续讲数据结构 今天先是 分块 在统计问题中,尤其是序列问题,经常涉及到区间的操作,比如修改一段区间的元素,询问某个区间的元素的信息. 如果每次都对一整个区间的每一个元素进行操作的话,那可能就很笨重,所以怎么快速地统计某一段区间的信息就成为了问题所在. 我们考虑把整个序列分成若干个区间,每一个区间称为一个“块”,这样,修改或者询问的每一个区间都能被表示为若干个连续的整块和若干个单个元素的拼接. 对于连续的整块,我们直接询问或者修改这个整块的信息即可,对于单个的元素我们暴力遍历一遍.

学大数据选自学还是培训呢

在你决定学一门技术时,那么有一个问题是你必须关注的,那就是有哪些学习方式,哪种学习方式好,哪种学习方式是你心仪的?当不同的学习方式产生冲突时,你该选择什么样的学习方式?比如当下学大数据有最常见的就是自学大数据和大数据培训,学大数据选自学还是培训呢? 自学大数据肯定是大部分朋友比较心仪的,谁不心疼钱呢?但是大数据培训效果比较好啊,这也是不可否认的,当这两种学习方式发生冲突的时,你该选择哪种学习方式呢?你心里有底吗?对于大数据的学习,长沙尚学堂小编的建议是选择大数据培训,理由很多. 大数据要学的东西

大数据开发经验分享:女生学大数据开发优势

在大数据时代下,大数据开发工程师和数据分析师都是非常多的人想要进入的行业.那么,作为女生学大数据难度大吗?女生学习大数据开发有什么优势吗?今天,我们针对此问题做个解答.一.与男性相比,女性在沟通上更有优势众所周知,做大数据就是为了服务于客户,虽然说做出项目可以满足于客户需求,但是如何完整地表达出你所做的项目初衷,则是不少男性大数据工程师的硬伤.女性给人平易近人的感觉,在与客户的沟通中会给客户以好感,自然能够减少与客户的沟通障碍.二.外界对女性工程师的期望值不高现在我们总是在强调男女平等,但是由于

零基础学大数据编程需要哪些基础?

零基础学大数据编程需要哪些基础?程序员薪酬高.工作环境好,是很多同学向往的职业,让很多非计算机专业的同学羡慕不已.非计算机专业难道就不能成为程序员了吗? 一.零基础学大数据编程需要基础: 1.数学基础 从计算机发展和应用的历史来看计算机的数学模型和体系结构等都是有数学家提出的,最早的计算机也是为数值计算而设计的.因此,要学好计算机就要有一定的数学基础,出学者有高中水平就差不多了. 2.逻辑思维能力的培养 学程序设计要有一定的逻辑思维能力,逻思力的培养要长时间的实践锻炼. 要想成为一名优秀的程序员

跟风舞烟学大数据可视化-Echarts从入门到上手实战

跟风舞烟学大数据可视化-Echarts从入门到上手实战 课程观看地址:http://www.xuetuwuyou.com/course/180 课程出自学途无忧网:http://www.xuetuwuyou.com 课程讲师:风舞烟 课时数:三个模块,共70课时   一.课程特色: 1.最全的Echarts课程讲解     70学时课时量,360度全方位,无死角的课程设计,让你通透Echarts可视化技术 2.最适合小白学员学习的课程,没有之一     只要你了解一点基本的Html,CSS,Ja

从0开始学大数据-Java运算符(3)

我们从零开始学习大数据技术,从java基础,到Linux技术涉猎,再深入到大数据技术的Hadoop.Spark.Storm技术,最后到大数据企业平台的搭建,层层递进,由点到面!希望技术大牛能过来指导学习. 上一节了解Java基础语法,本节我们开始学习Java基础-运算符,将会围绕以下几个知识点进行展开学习: 算术运算符 赋值运算符 比较运算符 逻辑运算符 位运算符 三元运算符 PS:开始之前我们先针对上节数据类型中补充的几个小问题 一.数据类型中补充的几个小问题 1.byte值的问题 byte

从0开始学大数据-Java基础-三元运算符/键盘录入(4)

我们从零开始学习大数据技术,从java基础,到Linux技术涉猎,再深入到大数据技术的Hadoop.Spark.Storm技术,最后到大数据企业平台的搭建,层层递进,由点到面!希望技术大牛能过来指导学习. 上一节了解Java运算符,其中三元运算符没有做讲解,本节我们开始学习Java基础-三元运算符/键盘录入,将会围绕以下几个知识点进行展开学习: 三元运算符 键盘录入数据 一.运算符 1.三元运算符 接着上一节的话题运算符,本节讲三元运算符,在讲三元运算符之前,可能会有很多朋友会问,是不是有一元运

从零开始学大数据-Java基础-switch语句(6)

我们从零开始学习大数据技术,从java基础,到Linux技术涉猎,再深入到大数据技术的Hadoop.Spark.Storm技术,最后到大数据企业平台的搭建,层层递进,由点到面!希望技术大牛能过来指导学习. 上一节学习了流程控制语句,本节学习switch语句. 开始之前,我们先看一下上节的练习题. 一.练习题 if语句格式的练习: 1.获取两个数据中较大的值 2.判断一个数据是奇数还是偶数,并输出 程序执行结果如下: 二.switch语句 流程控制语句的选择结构 1 选择结构(也被称为分支结构)