在写这篇文章之前,xxx经已写过了几篇关于改数组、变量-主题的文章,想要了解的朋友可以去翻一下之前的文章
一、选择题
1、目题略,此处主要有一个考点,如下。
对于一个维二数组int a[3],a和&a的值是一样的,但是也是有别区的。a+1的值会根据数组a的类型定决增长的小大,这里int类型小大为4个字节,所以a+1比a大4,而应用&后之,出取的地址是没有类型的,&a+1现实只比&a大1。
2、第二题单简,只要道知short类型占两个字节便可。
二、简答题
1、static关键字的用作,个人教训主要有以下几种:1)函数局部static变量,第一次函数调用被初始化,后续每次调用将应用前次调用后保存的值;2)全局变量中static变量,可以避免被其他文件的码代应用这个变量,有点将这个全局变量设置为private的象征;3)对于static函数来讲,效果和2中的变量同相;4)C++类中static方法,不须要实例化问访;5)C++定义static类成员变量,不须要实例化问访,不过须要先定义,定义的时候可以初始化数组。
2、volatile用来声明一个变量,并强制程序在每次应用变量的从新从变量地址取读据数,这是为了避免变量在其他方地被变改,而程序仍然应用没有更新的据数。
3、略
4、略
三、编程题
1、给定升序自然数数组,字数有复重,二分算法求给定恣意字数位置,参数定决是给定字数的开始位置还是结束位置。这里关键是开始结束位置的高效定判,码代如下。
1 #include <stdio.h> 2 3 int array[]={1,2,2,2,2,3,3,3,3,4,4,4,4,6,6,6,8,8,8,10}; 4 5 int search(int *array, int begin, int end, int number, int left) 6 { 7 if(array == NULL) 8 return -1; 9 10 if(begin > end) 11 return -1; 12 13 int middle = (begin + end) / 2; 14 if(array[middle] == number) 15 { 16 if(left) 17 { 18 int leftindex = middle - 1; 19 if(leftindex >= begin) 20 { 21 if(array[leftindex] < array[middle]) 22 return middle; 23 else 24 end = leftindex; 25 } 26 else 27 return middle; 28 } 29 else 30 { 31 int rightindex = middle + 1; 32 if(rightindex <= end) 33 { 34 if(array[rightindex] > array[middle]) 35 return middle; 36 else 37 begin = rightindex; 38 } 39 else 40 return middle; 41 } 42 } 43 else if(array[middle] < number) 44 begin = middle + 1; 45 else 46 end = middle - 1; 47 48 return search(array, begin, end, number, left); 49 } 50 51 int main() 52 { 53 int n = search(array, 0, sizeof(array)/sizeof(int) - 1, 4, 0); 54 printf("%d\n", n); 55 return 0; 56 }
直接做的话,复杂度是nlog(n)的,用一个hash表的方法,复杂度为O(数组中大最数-数组中最数小),目测还不如直接做,n复杂度的如下。
1 #include <stdio.h> 2 3 int array[]={100, 2, 1, 3, 8, 5, 4}; 4 int size = sizeof(array) / sizeof(int); 5 6 //结构两个陋简的hash表,一个是用来询查字数是不是存在,一个用于标记字数是不是应用过 7 char hash_exist[1024]; 8 char hash_used[1024]; 9 10 int main() 11 { 12 int i, j, n, max = 0, maxnum = array[0], minnum = array[0]; 13 for(i = 0; i < size; i++) 14 { 15 //标记字数存在 16 hash_exist[array[i]] = 1; 17 //找出数组大最素元 18 if(maxnum < array[i]) maxnum = array[i]; 19 //找出数组小最素元 20 if(minnum > array[i]) minnum = array[i]; 21 } 22 for(i = 0; i < size; i++) 23 { 24 j = array[i]; 25 //如果经已计统过,就跳过 26 if(hash_used[j]) 27 continue; 28 //标记本身 29 n = 1; 30 hash_used[j] = 1; 31 //比array[i]大的连续素元计统 32 while(++j <= maxnum) 33 { 34 if(hash_exist[j]) 35 { 36 n++; 37 hash_used[j] = 1; 38 } 39 else 40 break; 41 } 42 //比array[i]小的连续素元计统 43 j = array[i]; 44 while(--j >= minnum) 45 { 46 if(hash_exist[j]) 47 { 48 n++; 49 hash_used[j] = 1; 50 } 51 else 52 break; 53 } 54 //更新大最连续字数 55 if(n > max) max = n; 56 } 57 printf("%d\n", max); 58 return 0; 59 }
文章结束给大家分享下程序员的一些笑话语录: 《诺基亚投资手机浏览器UCWEB,资金不详或控股》杯具了,好不容易养大的闺女嫁外国。(心疼是你养的吗?中国创业型公司创业初期哪个从国有银行贷到过钱?)