Hou


  • 首页

  • 归档

  • 标签

  • 关于

calculator to exam

发表于 2016-03-21   |  

接上回,发现理解错了题意,应该是做一个可以给学生出题,并且判断对错的程序。稍微修改了下。

目前实现的功能:

  • 随机出10道题目,供同学练习
  • 如果同学做完之后不满意,可以重新来过
  • 程序记录考试完成的时间,以及正确错误的次数

2016年03月21日20:48:25

现代软件工程:计算器的制作

发表于 2016-03-20   |  

目标:戳我

  • 除了整数以外,还要支持真分数的四则运算。 (例如: 1/6 + 1/8 = 7/24)
  • 让程序能接受用户输入答案,并判定对错。 最后给出总共 对/错 的数量。
  • 逐步扩展功能和可以支持的表达式类型,最后希望能支持下面类型的题目 (最多 10 个运算符,括号的数量不限制):
    1. 25 - 3 * 4 - 2 / 2 + 89 = ?
    2. 1/2 + 1/3 - 1/4 = ?
    3. (5 - 4 ) * (3 +28) =?
  • 一次可以批量出 100 道以上的题目,保存在文本文件中, 并且保证题目不能重复,(1+2) 和 (2+1) 是重复的题目。 怎么保证题目不重复呢,请看详细题目要求

分析

题目要求有整数和分数的混合输入(不排除加上小数的混合输入),而且要求运算结果也需要为“真分数”的方式给出。好像没有现成的数据结构可以用,因此,这里先定义一个数据结构:Number

Number 成员变量:

  1. fenmu :分数的分母
  2. fenzi :分数的分子
  3. type :表示正负。当输入为小数时用来辅助操作

此外还包括一些基本的函数,比如分母分子的约分,分母是否为0,定义了Number的加减乘除操作,以及覆盖的toString方法等等。为了与正常四则运算的”/“区分,这里引入了一个”$”符号,来表述Number之间的除法运算。

都说代码=数据结构+算法,现在有了数据结构,接下来的工作就是找一个算法来解析四则运算公式了。这里我用到的是首尾扫描,把四则运算的字符串标准化,然后用栈来辅助计算的方法。

标准化

所谓标准化,就是把四则运算所在的字符串中的括号,小数点等不是数字,又不是运算符的字符。消除的方法是递归调用。

算法
  1. 如果输入的字符串str里面不包含任何的”(“,”)”以及”.”,那么可以直接计算。这里运算的优先级:$ 优先于 /,优先于 + - ;进栈出栈的基本方法:用一个变量保存当前扫描光标所在位置之前最近出现的符号o,扫描到数字,如果o为加减,减乘-1,加直接进栈;如果是乘除,则要取出栈顶元素然后跟当前元素进行乘除运算,进栈;加上$,需要多一个变量来保存$之前的操作符,原理是一样的,简单不过要复杂些,细心点就不会弄错了,比如$之前是 / ,这时候只需要栈顶元素乘以当前数字构成的Number,如果之前是,则直接相乘。
  2. 如果str中包含括号,先判断左右括号的数量以及出现的位置是否合法,如果合法则报错,提示用户重新输入;如果合法,把括号内部的内容拿出来带入第一步,得到一个Number,然后用Number的toString值替换括号出现的区域;
  3. 如果str中包含小数点。则扫描str,得到小数点前后的数,把这个数用Number表示出来,然后用此Number的toString方法替代掉小数点所在的区间,返回s;

有了后台的算法,做个图形化界面就不是难事儿了

  1. 可以用鼠标点击按钮来输入,也可以在输入框中直接键盘输入。
  2. 随机生成:默认是生成n个运算符,n在1~3之间,大小在10以内的n+1数
  3. 重置:清空输入和输出
  4. 计算:获得结果
  5. 目前的版本,随机输入还不能生成带括号的字符串..还没想到一个比较好的方法去去重,好像应该选树节点的方式来做的,那样子貌似可以方便去重。

先这样子…回寝室再写

2016年03月20日22:37:16

一道编程题:贪食蛇可以获得的最大分数?

发表于 2016-03-18   |  

题目如下:给定一个矩阵,没给点上都有一个整数,取值范围为-1~1000。我们的猪脚贪食蛇从最左侧出发,目的地是最右边的任意一个点。每走过一个点,贪食蛇可以获取位置上的分数。

游戏规则如下:

  • 贪食蛇只可以往上,往下,往右移动;贪食蛇
  • 贪食蛇不可以走回头路:走过的点不可以再走
  • 如果贪食蛇不可以到达目的点,返回-1;可以的话返回可以得到的最大的分数
  • 贪食蛇可以穿越上下边界,比如从下届穿越到上界只是这时候几分要清零
  • 值为1点不可以走
阅读全文 »

Maven项目部署到Linux服务器

发表于 2016-01-25   |  

上一次用linux服务器还是半年前,那次是非maven的项目。记得大概流程是把项目所需要的jar包,还有项目生成的target下的class文件上传到服务器,然后用一个sh文件运行。

1
2
3
4
5
6
7
APP_HOME=/root/autocrawler
for i in "$APP_HOME"/lib/*.jar
do
CLASSPATH="$CLASSPATH":"$i"
done
export CLASSPATH=.:$CLASSPATH
nohup java -Xms50m -Xmx250m spider.test.WebCrawlerFinalTest &

现在换成了Maven的工程因为项目所需要的jar包被maven管理,所以一时还手忙脚乱不知道怎么做好。好不容易成功了,现在总结下免得下次再用的时候忘记了。

阅读全文 »

redis的性能优势..震惊了

发表于 2016-01-12   |  

##接上回,上次处理一个日志文件,

如果用远程数据库的话需要43分钟;
如果用远程redis的话需要10分钟;
如果用本地redis的话,处理8个日志文件只需要…34秒!?

而且没有报那种cannot cast to 的错误(我用了类文件到class文件的转换)。

我了个大去..这个太厉害了…

2016年1月12日12:01:19

Redis太棒了!

发表于 2016-01-09   |  

最近在做一个分析日志的程序。

一开始是用MySQL做的,远程读取数据库,很慢。是这样的,爬虫程序没30分钟可以产生8个日志文件,每个日志文件10M,用mysql来处理的话,我处理一个日志文件需要43分钟。。太坑爹了。

然后想到了内存数据库Redis,正好一个月前读了《Redis实战》嘛。正好实战下。

过程是这样子的,我先把整个数据库读取到Redis里面。然后把查询mysql改成查询redis。这样子确实带来了性能的提升。从43分钟进步到了10分钟。

这里有个问题。

redis是内存数据库,我去远程查另一台电脑上面的redis队列的内容,为什么不在本地建几个HashMap呢?

这两个哪个性能更优一些呢?明天的时候有空试验下..

2016年1月9日00:42:03

Maximal Square. 出乎意料的结果..

发表于 2016-01-03   |  

真的是不知道不明了呀..

有的时候吧,以为自己做的不错,结果却是超时;有的时候吧,以为自己用的是笨方法,结果却是相当不错..这次就算这样子的,用了个笨方法,却超过了88%的方案..

题目如下:https://leetcode.com/problems/maximal-square

就算扫描每个节点,假设以当前节点当做结果正方形的左上角的顶点,求出当前节点下的最大面积。

阅读全文 »

Books and Movies in 2015

发表于 2015-12-31   |  

#不看不知道一看吓一跳..自己这俩月疯狂读了这么多书呢!

2016要继续加油!

阅读全文 »

《时代感》--岁月带给我们的

发表于 2015-12-24   |  

首先给个评价:5星好评。

这本书讲的是作者张若雪这些年来经历的一些事情,从他的父亲母亲,他小的时候做知青,知青的时候学会的抽烟卷烟,喝酒,后来的几次戒烟,手术,自己的侄子,自己的兄弟们。感触最深的是他的学生那一章节。

阅读全文 »

System.out.print 语句对java性能的影响

发表于 2015-12-24   |  

做这个题目的时候发现的:https://leetcode.com/problems/container-with-most-water/

Given n non-negative integers a1, a2, …, an, where each represents a point at coordinate (i, ai). n vertical lines are drawn such that the two endpoints of line i is at (i, ai) and (i, 0). Find two lines, which together with x-axis forms a container, such that the container contains the most water.

Note: You may not slant the container.

我的思想是首尾两个指针扫描,感觉有点快速排序的那个意思。计算当前的面积,与最大面积进行比较,如果当前大,那么最大面积=当前面积。然后比较首尾元素,让更小的那一端移动。直到首尾相差为1。

线性的时间复杂度。但是提交之后却报错time out,百思不得其解..后来我把输出语句给注释掉之后竟然通过了!!原来print语句这么耗费时间的吗??

长度为5000的数组进行本地测试的结果(注释掉print前后):
前:137毫秒
后:0毫秒

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public int maxArea(int[] height) {
if (height.length < 2)
return 0;
else {
int low = 0, high = height.length - 1;
int max = Math.min(height[low], height[high]) * (high - low);
while (low < high) {
if (height[low] <= height[high]) {
low++;
} else
high--;

System.out.println(low + ", " + high);
max = Math.max(max, Math.min(height[low], height[high]) * (high - low));
System.out.println(max);
}
System.out.println(max);
return max;
}
}

2015年12月24日12:08:07

123
Houweitao

Houweitao

to be better man

30 日志
12 标签
GitHub 微博
© 2015 - 2017 Houweitao
由 Hexo 强力驱动
主题 - NexT.Mist
本站访客数人次 本文总阅读量次