学习笔记3--数组

  最近学了数组,数组的概念是:数组是相同类型的值得集合。数组中的元素访问形式:数组[数字] 下标从0开始到n-1。要注意:下标一般都是从0开始的。有一维数组二维数组字符数组。本章感觉让我收获最大的是sort排序与set和map容器。sort是好用的,但不熟悉所以在这次题里只有一个用了sort,还写的很长,不过容易看懂,我是觉得sort最好用,默认的sort函数是按升序排。sort(a,a+n); //两个参数分别为待排序数组的首地址和尾地址 但其它的几个也要掌握(插入排序、冒泡排序、折半查找)。还有从学姐那里学到了一个万能头文件,是include<bits/stdc++.h>,它包含了所有头文件,如果出现找不到头文件的错误就把这个写上,学着去看错误有专门总结coldeblock报错。在一个是字符串,string表字符串,

  本次做题过程中出现了各种错误,比如runtime error,这个错误出现的原因有以下几个:runtime error (运行时错误)就是程序运行到一半,程序就崩溃了。比如说:1、除以零2、数组越界:int a[3]; a[10000000]=10;3、指针越界:int * p; p=(int *)malloc(5 * sizeof(int)); *(p+1000000)=10;4、使用已经释放的空间:int * p; p=(int *)malloc(5 * sizeof(int));free(p); *p=10;5、数组开得太大,超出了栈的范围,造成栈溢出。我做题犯的错大多就是数组越界或是数组开的太大。真的要注意

下标越界是大忌!

编译程序不检查是否越界

下标越界,将访问数组以外的空间

那里的数据是未知的,不受我们掌控,可能带来严重后果。

 

以下是例子:

1、有趣的跳跃

一个长度为n(n>0)的序列中存在“有趣的跳跃”当前仅当相邻元素的差的绝对值经过排序后正好是从1到(n-1)。例如,1 4 2 3存在“有趣的跳跃”,因为差的绝对值分别为3,2,1。当然,任何只包含单个元素的序列一定存在“有趣的跳跃”。你需要写一个程序判定给定序列是否存在“有趣的跳跃”。

 

输入

一行,第一个数是n(0 < n < 3000),为序列长度,接下来有n个整数,依次为序列中各元素,各元素的绝对值均不超过1,000,000,000。

正解:

#include <iostream>

#include <math.h>

using namespace std;

int main()

{

    int i,n,s,a[3010],b[3010],q;

    cin>>n;

    for(i=0;i<n;i++)cin>>a[i];

    for(i=0;i<n-1;i++)b[i]=fabs(a[i]-a[i+1]);

s=0;

for(i=0;i<n-1&&s==0;i++)

{

if(i==0&&(b[i]==0||b[i]>=n))

{

s+=1;

break;

}

for(q=i+1;q<n-1;q++)

{

            if(b[i]==b[q]||b[q]==0||b[q]>=n)

            {

                s+=1;

                break;

            }

        }

    }

if(s==0)cout<<"Jolly";

    else cout<<"Not jolly";

    return 0;

}

错误原因:a与b数组的范围开的太大

2、字符串hash(这个是自己的重点!!!)

给定N个单词(每个单词长度不超过100,单词字符串内仅包含小写字母)。

 

请求出N个单词中共有多少个不同的单词。

 

输入

第1行包含1个正整数N。

接下来N行每行包含一个字符串。

输出

一个整数,代表不同单词的个数

错解:

#include <iostream>

#include <string>

#include <set>

using namespace std;

int main()

{

 int i,N,j,s;

 cin>>N;

 string a[11110],b[11110];

 for(i=0;i<N;i++)

 cin>>a[i];

 for(i=0;i<N;i++)

 b[i]=a[i];

 s=N;

 for(i=0;i<N-1;i++)

 {

  for(j=i+1;j<N;j++)

  if(b[i]==a[j])

  {

   s=s-1;

   break;

  }

 }

 cout<<s;

 return 0;

}

(这个做法本身不对,和数组开大开小没关系,但我也不明白为啥不对,只知道这种题用set或map做几行就能解决,出这道题的目的应该是想让我们知道有map容器和set)

正解:

#include<iostream>

#include<set>

#include<string>

using namespace std;

set<string> b;

int main(void)

{

 int n;

 string a;

 cin>>n;

 for(int i=0;i<n;i++)

 {

  cin>>a;

  b.insert(a);

 }

 cout<<b.size();

}

以下是从于同学那里学到的知识:

set与map是vector(容器)的两种,set好用是因为set中没有重复的元素(若有相同元素被放到set中的话它会覆盖原来的相同值以保证容器中一样的元素只有一个)且各个元素有序排列,只需将元素插入到set中即可(小到大)set使用要:

#include <set>b 声明集合b

b.insert(a)向集合b中插入a

cout<<b.size()输出集合b的长度。

对于map而言百度的是:Map是STL[1]的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。这里说下map内部数据的组织,map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的,后边我们会见识到有序的好处。同样是使用insert函数插入数据

注意头文件中要有#include<map>

第二个错是:Time Limit Exceeded说明这个程序的运行时间超过了这个限度。原因有:1、没有循环终止条件。(for循环里面的条件>与<写混了)2、函数调用超时。(这个不懂,总之换种做法做吧)3、3.程序算法不够优化。(老师讲过这样的,一定要将程序算法能优化则优化,不然在时间限制内运行不完程序还是过不了!!!)

第三个错是常见的wrong answer

还是要考虑问题的多种可能,一种也不能漏。

第四个错是Output Limit Exceed,Output Limit Exceed是超过输出限制(OLE)错误,提示程序产生了过多的输出信息,一般是由于死循环造成的。再简单点说是程序输出了过多的东西,甚至超出了评判系统为了自我保护而设定的被评判程序输出大小的最高上限。这个是在做做游戏时出的错。就是控制循环的i忘记在一次循环后令i++。

第五个错是presentation error

presentation error 意为输出格式错误,也就是你的输出没有按照输出要求进行格式化。一般是多了或者少了一些空格或者空行。输出时要注意空格。

以上的错误都是这次这次做数组题时出现的,说明数组掌握的不好还是要多加练习。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值