试题编号: | 201712-1 |
---|---|
试题名称: | 最小差值 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 具体如下 |
问题描述
给定n个数,请找出其中相差(差的绝对值)最小的两个数,输出它们的差值的绝对值。
输入格式
输入第一行包含一个整数n。
第二行包含n个正整数,相邻整数之间使用一个空格分隔。
输出格式
输出一个整数,表示答案。
样例输入
5
1 5 4 8 20
样例输出
1
样例说明
相差最小的两个数是5和4,它们之间的差值是1。
样例输入
5
9 3 6 1 3
样例输出
0
样例说明
有两个相同的数3,它们之间的差值是0.
数据规模和约定
对于所有评测用例,2 ≤ n ≤ 1000,每个给定的整数都是不超过10000的正整数。
问题链接:CCF201712-1 最小差值
问题分析:
模块/分析 | 思路 | 数据结构选择 | 算法实现 |
---|---|---|---|
输入/数据初始化 | 在主函数中接受n,为了模块化,将输入数据功能写成函数,主函数调用其即可 | 全局向量容器构造数组对象储存数据 | 使用一个for循环 |
数据处理 | 最直观想法是计算出任意两个数并进行比较,可见计算与比较次数相同,均为n(n-1)/2次;若是先对数组排序,只需计算与比较n-1次。由于只需输出差值,所以不需要记录具体的两个值,先计算出第一个差值,计算出当前差值立即与之前差值比较,保留较小者 | 整型中间变量 | 冒泡排序;一个for循环;绝对值函数 |
输出 | 只需输出数据处理的结果 | 存储最小值的整型中间变量 | 输出控制台即可 |
C++代码
#include<iostream>
using namespace std;
#include<vector>
#include<math.h>
vector<int> array;//为了便利,使用容器定义全局整型数组
void inputData(int n)//数据输入
{
int temp=0;
for(int i=0;i<n;i++)
{
cin>>temp;
//向量容器输入必须用函数,不能像数组一样用[];
//若是嵌套向量,必须使用辅助向量想输入里层的值,在将其存入外层
array.push_back(temp);
}
}
//自写的冒泡排序,参数为引用的全局数组
void bubbleSort(vector<int>& arr,int n)
{
for(int i=0;i<n-1;i++)
{
for(int j=i+1;j<n;j++)
{
if(arr[i]>arr[j])
{
int tmp=arr[i];
arr[i]=arr[j];
arr[j]=tmp;
}
}
}
}
//数据处理函数,找到最小差值并直接输出;
//由于输出十分简单,故将输出函数合并于此
void min(vector<int>& arr,int n)
{
int min=0;
bubbleSort(arr,n);
min=abs(arr[1]-arr[0]);
for(int i=1;i<n-1;i++)
{
if(min>abs(arr[i]-arr[i+1]))min=abs(arr[i]-arr[i+1]);
}
cout<<min;
}
int main()
{
int n;
cin>>n;
inputData(n);
min(array,n);
return 0;
}
心得体会
- vector虽然比较方便,但是使用时要注意细节,记住他是对象,干啥都要调用函数
- 博客之牛刀小试
- 描述与分析问题显然不够简洁清晰,有些啰嗦;
- 排版美化,重点概述,标题命名怎么四两拨千斤,最简洁的话表达最多信息,同时还有自己分格
- md的表格无法换行,这很难受,后续改进
- 自豪的是用表格的方式将问题分解为三个大模块:数据的输入、处理、输出;三个模块各自又对应着具有依赖关系的三个分析步骤:首先明确目标,思路成型后使用自然语言表述解决方案 ,其次根据解决方案选着合适的数据结构,同时设计相应的算法。
- 在可以将问题分解的情况下,不存在难题。所以问题解决时对其的分解尤其重要,想要分解就必须能够清楚的将各种情况分开,找到他的结构框架,这一步是最难的;进而细化,找到框架后越细化越简单,因为越来越接近熟悉的知识
- 表达无论在哪一行都极其重要,像是编程语言,无非熟能生巧,自然语言更是如此,书写表达需要长期坚持磨炼,在2018/9/15凌晨一点纪念这良好的开端。
- 知识的意义在于分享,写博客真是个利人利己的事,希望看到这里的你继续加油!加油!