- 有一个整数数组,请求出两两之差绝对值最小的值,记住,只要得出最小值即可,不需要求出是哪两个数。
- 方法一:暴力求解,遍历数组记录两两之差,求得最小值。算法时间复杂度为O(n2)。
- 方法二:设原始数组为A[n](a1,a2,a3......),构造数组B[n](a1,a2,a3,a4......);b1=a1-a2,b2=a2-a3.....bn=an-1 - an;则在原数组中,任意两个整数之差ai - aj (1<=i,j<=n)可以表示为第 i 到第 j-1 个元素的连续求和。假设原始数组A[n],1)先找出最大值max,最小值min,O(n)时间。2)然后设B[max-min+1],,初始化每个元素为0;利用桶排序的思想,将每个元素A[i]放进B[A[i]-min],如果在放之前B[j]不等于零,则说明有相等的数,因此两两之差绝对值最小为0。否则继续,直到全部放好。3)这样A中的每个元素都对应B中的每个元素,该元素值非零(值为零的元素说明A中没有)。这个过程复杂度为O(n)
这样就将问题转化为,求B中值为0的元素的最小串的问题~~【此方法思路比较新颖,想法和出发点值得参考】 - 方法三:对数组进行排序,然后计算相邻差值,比较得到最小的即为所求。(使用快速排序)
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> int partition(int *a,int low,int high){ int pos = a[low]; while(low < high){ while(low<high&&pos<=a[low]){ high--; a[low] = a[high]; } while(low<high&&pos>=a[low]){ low++; a[high] = a[low]; } } a[low] = pos; return low; } void QuickSort(int *a,int low,int high){ if(low<high){ int pos = partition(a,low,high); QuickSort(a,low,pos-1); QuickSort(a,pos+1,high); } } int main() { int array[] = {0,-9,3,7,-5,4}; QuickSort(array,0,5); for(int i=0;i<6;i++) printf("%d\n",array[i]); int j = 1; int min = abs(array[0]- array[1]); for(;j<5;j++){ if(min > abs(array[j]-array[j+1])) min = abs(array[j]-array[j+1]); } printf("min = %d\n",min); return 0; }
写一个函数,检查字符是否是整数,如果是,返回其整数值。(或者:怎样只用4行代码编写出一个从字符串到长整形的函数?)
基础知识补充,对于一个个给定的字符x,比如x = ‘6’,如何求x所对应的数字6呢?我们知道计算机存储实际上存储的是其ASCII码,对于字符x='6'实际上存储的是ASCII码54,字符'0‘是48,’1’是49,这样的话,对于任意一个字符我们都可以通过x-'0'的方式来求其对应的数字值。递归实现:
long atoi(char *str,int length){
if(length>1){
return str[0]=='-'?atoi(str,length-1)*10-(str[length-1]-'0');atoi(str,length-1)*10+(str[length-1]-'0');
}else
return (str[0]=='-'||str[0]=='+')?0:str[0]-'0';
}
非递归实现:
long atoi(char *str,int length){
int i=0,sign=1,result=0;
if(str==NULL&&length<1)
return -1;
if(str[0]=='-')
sign=-1,i++;
else if(str[0]=='+')
i++;
//注意,这里一定要加上“i<length”这个条件。若是不加这个条件,则值isdigit(str[length])有可能返回true,
//即越界元素str[length]有是数字字符的可能性.这样以来程序就错了!
while(i<length&&'0'<=str[i]<='9')
result=result*10+str[i]-'0',i++;
if(i==length)
return result*sign;
return -1;
}