做题心得篇12.26
无聊的眺爷
题目描述
最近眺爷无聊的玩起了数格点的游戏,现给定平面上的两个格点 p1 = (x1,y1) 和 p2 = (x2,y2), 他想找出线段p1p2上除p1和p2以外一共有几个格点?但他总是数错, 你能写个程序帮帮他吗?
输入
第一行 : x1,y1
第二行:x2,y2
输出
格点数
样例输入 复制
1 11
5 3
样例输出 复制
3
先看代码:
#include<stdio.h>
#include<math.h>int main(){int x1,x2,y1,y2;scanf("%d %d",&x1,&y1);scanf("%d %d",&x2,&y2);int x=abs(x1-x2);int y=abs(y1-y2);while(y){int h=x%y;x=y;y=h;}if(x>0) printf("%d\n",x-1);else printf("0\n");return 0;
}
先对题目进行解读,了解了题意就是一个很好解决的求最大公约数的问题了:我写这个题的时候以为是个水题,就是只是把两个x值相减再减一就是正确答案,然后又符合样例,真是天助我也,但我一交,迎面而来的就是一个大错,这到底是为什么呢?首先我去搜了一下格点的定义:数学上把在 平面直角坐标系 中横纵坐标均为整数的点称为格点 (lattice point)或 整点 。看,这里有个前提条件就是整数。而像我刚刚的想法就是:如果两点确定了一条直线那么每一个x值对应的都有一个点呀,但是忘了那不是格点,所以我们要确保他是整数,而这里就是可以找它的最大公约数,之所以要找最大公约数是因为,我们要找格子的话,要横纵坐标都要是整数,而这样的话,就得是横纵坐标都可以整份整份的的分开而且都是整数,然后又是最大的份数,而为什么要是公约数呢,嗯,我自己的记忆方法就是:一般求这种最值的时候,都是相等时取,所以可以这么认为用公约数。而且我们并不知道它到底取了啥,只能说只有当x和y的份数一样的时候才会存在一个格点,你看红图里面,如果x和y的值都不对应的话怎么有格点红色线相交的地方就是格点(当然实际原理我现在都还没弄明白),这里之所以再减个一的话是由于还没有将两个端点放进去,可能说起来难,我这里画一下:
代码的话比较简单,没什么好说的。
Jack的字符串问题
题目描述
阿操最讨厌写字符串的题目,看到眼前密密麻麻的字母就烦。这件事的起因就是很久很久以前的一次找重复字符的位置。 现在有一个字符串,我们要找出其中的重复的字符并输出这些字符和字符的位置,如:aabcaabc22 输出 a,0;a,1;a,4;a,5,b,2;b,6,c,3;c,7;2,8;2,9
输入
输入一行字符串(字符串中只含数字和字母)。其长度不超过100。包括多组输入。
输出
根据样例的格式将重复出现的字符位置输出
样例输入
aabcaabc22
样例输出
a:0,a:1,a:4,a:5
b:2,b:6
c:3,c:7
2:8,2:9
写这个题的时候,我刚开始是没看见多组输入,然后又是理解错了题意,这里说的是将重复出现的的字符位置,注意是重复出现,所以如果只出现了一次的话,就不用输出了,但是经过改良的代码还是过不了
#include<stdio.h>
#include<string.h>
char a[100];
int b[256];
int main()
{while(scanf("%s",a)!=EOF){int l=strlen(a);for(int i=0; i<l; i++){b[a[i]]++;}for(int i=0;i<l;i++)if(b[a[i]]>1){for(int j=i;j<l;j++){if(a[j]==a[i]){printf("%c:%d",a[j],j);if(b[a[i]]>1)printf(",");b[a[i]]--;}}printf("\n");}}return 0;}
这里浅浅解释一下代码,虽然过不了,但是我看还是没什么问题的:
多组输入循环里面的第一个循环就是把a里面的元素装到b数组里面当序号,而由于a是字符数组,所以应该把它转化为每个元素的ASCII值的序号,所以b数组必须开到足够装下最好是所有ascii值的数;这里有个重点标记一下:就是这里
for(int i=0; i<l; i++)
{
b[a[i]]++;
}
的意思是让每装进一个就让它加一,而这里如果a数组里面的字符是一样的,b数组就在原来的基础上再加一,例如输入的是aab,看图,红的表示a数组,绿色的表示b数组
第二个循环就是判断是否重复,因为在第一个循环已经,已经将数组b中被有a数组的标记为大于零,而重复的则大于一,而第二个循环要做的就是将重复的找到并进入下一个循环,找后续相同的并打印,而那个都好之所以要单独分出来打印是因为在一个重复字符的最后面后面没有逗号,我们只需要在他最后一次输出字符位置的时候不打出逗号就行了, b[a[i]]--;而这玩意是让重复字符输出一次就让对应的b数组减一,从而达到输出b数组的效果。当然,这种错误代码还是过不了,那就只能去学别人的。我从王二麻子那里顺来的:
#include<stdio.h>
#include<string.h>
int main()
{char s[105];while(scanf("%s",s)!=EOF)//循环输入字符串{char a[105]={'\0'};//定义数组a记录重复字符int b[105]={0};//数组B方便输出int i,j,k=0,t,l,p;l=strlen(s);for(i=0;i<l-1;i++)for(j=i+1;j<l;j++)if(s[i]==s[j]){a[k++]=s[i];break;}//循环输入重复的字符for(i=0;i<k;i++)for(j=i+1;j<k+1;j++){if(a[i]==a[j]){for(t=j;t<k;t++)a[t]=a[t+1];k--;j--;}}//删除数组a中的重复字符k=strlen(a);for(i=0;i<k;i++)for(j=0;j<l;j++){if(a[i]==s[j])b[i]++;}for(i=0;i<k;i++){p=0;for(j=0;j<l;j++){if(a[i]==s[j]){printf("%c:%d",s[j],j);p++;if(p<b[i])printf(",");}}printf("\n");}//输出}
}
感谢王二麻子,现在我们来学习一下她的代码并分析一波:
先将a数组全部初始化为零,而b数组则初始化为整型0,浅浅提一嘴:对于strlen这个东西我一般是不用东西代替的,直接放入循环,多个就放多个,其实如果数量多的话,还是替代一下好一点,不仅是少了一点代码,还有就是它如果替代了strlen就只要算一次,否则的话就要算多次了,就是说就算是strlen(a)要计算机转换成长度也要时间呀。减缓了计算机的运算速率。第一个循环则用了一个选择排序也就是一个嵌套循环,嗯忘提了,这个s数组是定义在外面的全局变量,已经被初始化为0了,而选择循环里面,就是判断是否后面有和它重复的字符这里就可以记录重复字符(但是每一个重复字符的最后一个则不能放进a数组),有就放进a数组并结束小循环,继续找下一个,并用k进行计数,而第二选择排序则是就是让a数组里面的多余的重复的删除
嗯,这个图片里面有一句话说错了,就是,j--;的作用是避免忽略前移后新元素的判断。
等所有的都删完了,只剩单个元素,就让k为数组a的长度,注意l是原数组s的长度,再搞一个嵌套循环循环的长度分别是k和l,循环的目的是计算重复字符出现的次数,然后再进行一次循环,嵌套循环,但对于每一个大循环来说都定义一个p并初始化为零来计数,即对于每一个a[i]都遍历一次s[i]判断是否有相等的,如果有的话,打印s的相关信息,并且让p+1;并打出逗号,直到p和b[i]相等,最后打个换行符;
最后治愈人心的环节总是少不了:”泰戈尔曾说过:你受过的苦,吃过的亏,扛下的责,担下的罪,忍过的痛,到最后都会变成光,照亮你的路;“
做题心得篇12.26相关推荐
- ACM本周搜索做题小结和心得体会
这周除了接着看上次没看完剩下的题,主要的就是做题了 我把这周新学到的和以前还没总结过的以及做题心得再主要说一下 这周做题和看到的主要是以下这几类 我把这周做题时遇到的某几类题简单归了一下类然后总结 遍 ...
- 看了这篇 LeetCode 的刷题心得,再也不用抄别人代码了
作者:VioletJack 原文:<LeetCode 算法题刷题心得>https://www.jianshu.com/p/8876704ea9c8 花了十几天,把<算法>看了一 ...
- sqli-lab_基础篇_1-23做题反思
################################################### sqli-lab 1-23做题反思 get 类 1-4题:联合查询: 特点:输入特殊符号有报错提 ...
- buuctf-MISC篇做题笔记(2)
buuctf-MISC篇做题笔记(2) 第七题:基础破解 先看题目提示,可能也要暴力破解 打开后是RAR文件,需要密码 我是用RARpassword暴力破解,且根据题意已知是四位纯数字密码,设置破解的 ...
- 记录周三12.8的刷题心得ODAY
记录本周周三的刷题心得ODAY PTA地址 Python获取每一位的数字,并返回到列表 三种方法 通过计算 通过自带方法 通过字符串 Python从键盘输入多行文本数据的方法 链接
- 2018.12.10 第5题:定义两个类,描述如下: [必做题] 5.1定义一个人类Person: 5.1.1定义一个方法sayHello(),可以向对方发出问候语“hello,my name is
#定义两个类,描述如下: [必做题] 5.1定义一个人类Person: 5.1.1定义一个方法sayHello(),可以向对方发出问候语"hello,my name is XXX" ...
- 2018.12.10 第4题:定义两个类,描述如下: [必做题] 4.1定义一个人类Person: 4.1.1定义一个方法sayHello(),可以向对方发出问候语“hello,my name is
#定义两个类,描述如下: [必做题] 4.1定义一个人类Person: 4.1.1定义一个方法sayHello(),可以向对方发出问候语"hello,my name is XXX" ...
- 如何以正确地姿势AK SQL查询50题(精华篇)
前言------ AK: ALL Killed 这学期学数据库系统概论,作为一个初学者,必须先熟练掌握SQL的基本查询语句,在完成了老师的SQL50题之后,我把我自己地AK姿势记录下来, 便于回忆之余 ...
- verilog练习:hdlbits网站上的做题笔记(6)
前言 之前的文章<如何学习verilog,如何快速入门?>中提到了verilog学习,推荐了一个可以练习的网站:hdlbits网站,那自己也玩玩这个网站. 这篇文章,是接着<veri ...
最新文章
- 使用 git.oschina 码云 来托管 Hexo 搭建的博客
- 1.15 Java冒泡排序法
- 设计模式之职责链模式
- 计算机s1,计算机S0、S1、S2、S3、S4、S5状态
- Java 中Timer和TimerTask 定时器和定时任务使用的例子
- Docker快速安装ZooKeeper开源分布式协调服务器
- Windows去除快捷箭头
- java jtable 自动高度,自动调整JTable中行的高度
- pagehelper返回的total总是等于pagesize问题解决
- MyBatisPlus关键字查询
- 串口通信校验方式(even,odd,space,mark)UART数据波形分析
- (商品评价页)商品星级评分html+css+js
- KST-51单片机利用HC138芯片驱动数码管显示
- UR5双臂Gazebo仿真(Python)
- 完全卸载nvidia驱动
- node.js在2018年能继续火起来吗?我们来看看node.js的待遇情况
- 一个c程序的执行是从什么开始的?
- 安徽2021年高考成绩什么时候查询,2021年安徽高考成绩什么时候出来,几点可以查询到...
- Codeforces 1169B Pairs
- Alamofire入门笔记