HDU-1106 排序

  刚开始在HDU做题,也是刚开始发博客。虽然现在只是开始,相信以后会变得越来越好的~
  这道题其实是一个比较水的题,没用到什么特别的算法和结构,但是却很难一次性AC,目前作为编程小白的我经过好几个小时才把它弄出来。说起来也是心酸。
  在这里我把做这道题过程中遇到的一些问题和这道题本身的一些容易犯错的地方总结一下,为了自己以后避免有类似的错误,如果你看到了对你也有一些帮助的话就再好不过啦~
  题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1106
   解题思路:题目比较容易理解,一看题目就知道输入大概是要用到char数组,输出可以用int。根据这几天上程序设计方法学老师讲的,做一道题先列框架,那么这道题目的大概框架就是按照自上而下来 输入——分离被5隔开的数——排序——输出——循环,然后再进一步对每个步骤求精,其它部分很容易代码实现,分离被5隔开的数就需要进一步求精:我们需要把被5隔开的数分离开,还需要把这些输入的char型数变为int型(为了后面的排序)。char型变int型自然需要用到10的乘方乘以这个数求和,可是无法确定5的位置也就不知道10的乘方数,那么我们可以从输入数组的最后向前开始遍历,遇到5就到下一种情况。所以我们新建了一个数组来存储输出的和(*遇到的问题1),遍历开始后判断是否遇到5,没有就用该位置的数乘以10的乘方放进求和的数组里面(char型相乘时先减去48),乘方数我们就需要用一个数自加来表示,而且这个数需要在遇到5之后,也就是重新遇到一个数之后置0.然后我们就要考虑到筛选条件,什么样的数需要重置。情况主要有以下几种:
  ①以5开头(包括开头两个及以上的5)
  ②以5结尾(包括结尾之前有连续两个及以上的5)
  ③中间有5
  ④中间连续两个及以上的5
  基本就是这几种特殊情况,只要把常规和这几种情况考虑到并解决的话就基本没有问题了。
  我在做题过程中遇到的主要问题是:没有吧用于存储求和答案的数组置零!而且智商明显有问题的我竟然一直没有意识到这个问题,调试了好久,脑跑了好久竟然没发现问题!浪费了好多时间,而且这个问题之前也犯过,下次在看到数据异常之后一定要留意一下是不是这个问题。另外我没有考虑到开头连着出现几个5的情况,所以第一次提交时就WA了,因为在过程中我使用的判断方法是,如果这一项为5,而且上一项不为5那么就count++,跳到一个新数,在其它开头结尾为5的情况在上面判断,测试数据时也没有考虑到开头连续两个5的情况,结果发现:如果开头两个5,按照我的算法来,在遇到第一个5就count++,建立一个新数,但是前面到最开始一直都是5,本来没有数据可是我的运行结果里多了一个为0的数据。
  在知道这个问题之后我又尝试着去解决,最后想到可以不必修改算法,添加一个新的判断数据,ks,ks在新建一个数的时候会被置1,而在计算和的时候就又会被置0,在后面排序之前判断如果ks为1就count--,删去多算的那个,这样子就解决了这个问题。
  所以在以后做题过程中:首先一定要考虑到所有的边缘情况,考虑清楚然后再动手写算法,这样子不容易遗漏,以免到最后写的差不多了发现有一种情况按照自己的算法解决太过麻烦或者难以解决需要重新写。然后就是在遇到问题以后一定要想法多一点,比如我最开始一直想从本身的判断条件中改条件避免新建多余的数来解决,结果浪费了很多时间也没能改成。后来想到不一定避免它新建,我只要再加一个判断数据,它新建以后我直接在后面判断删掉不就好了?也就是说有些时候解决问题的办法不一定就在于不断修改全面的算法,说不定思路往外一跳,很容易就解决了。不要被代码算法束缚住思想。
  以后加油!!!争取从这些水题进军到有一定难度的题!!!最近还是多刷刷水题再说吧 | =_=  =_= |
#include<iostream>
#include<algorithm>
#include<math.h>
#include<cstring>
#define maxn 1005
using namespace std;
int main()
{
   char a[maxn];
   while(scanf("%s",a)!=EOF){
   	  int k=strlen(a),s[maxn],count=0,count2=0,ks=0;
   	  memset(s,0,sizeof(int)); 
   	  for(int i=k-1;i>=0;i--)
   	  {
   	  	if(a[i]!=53)
   	  	   {s[count]+=pow(10,count2)*(a[i]-48);
   	  	    ks=1;
			count2++;}
   	  	else if(a[i]==53)
   	  	{
   	  		if(i==k-1 || i==0 );
   	  		else{
   	  	    	if(a[i+1]!=53)
   	  		    {
				 count++;
   	  		     s[count]=0;
			     ks=0;	  } 	     	
			 }
			 count2=0;}
		 }
		 if(ks==0)
		    count--;
		 sort(s,s+count+1);
		 for(int i=0;i<count;i++)
		  cout<<s[i]<<" ";
		  cout<<s[count];
		 cout<<endl;
   }
}

  

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值