03 2014 档案
摘要:思路分析:一个为插入栈,另一个为弹出栈,可以认为插入站提供入队列的功能,弹出栈提供出队列的功能。如果弹出栈不为空,则直接弹出它的数据。如果弹出栈为空,则依次弹出插入栈的数据,放入弹出栈中,再弹出它的数据。代码如下:#include "stdafx.h"#include #include using namespace std;template class QueueByDoubleStack{public: size_t size(); bool empty(); void push(T t); void pop(); T top();private: st...
阅读全文
摘要:思路分析:intisdigit(charc)函数用来判断字符c是否为数字,当c为数字0~9时,返回非零值,否则返回零。使用时需要包含头文件。如果一个字符为数字,那输出它减去48之后的整数形式,即为这个数的值。代码如下:#include "stdafx.h"#include #include int main(){ int c; while ((c = getchar()) != EOF) { getchar(); if (isdigit(c)) printf("是:%d\n", c-48); else ...
阅读全文
摘要:方法一:递(sangxin)归(bingkuang)法,遍历字符串,每个字符只能取或不取。取该字符的话,就把该字符放到结果字符串中,遍历完毕后,输出结果字符串。代码如下:#include "stdafx.h"#include #include void CombineRecursiveImpl(const char* str, char* begin, char* end){ if (*str == 0) { *end = 0; if (begin != end) printf("%s", begin); return...
阅读全文
摘要:思路分析:采用hash法来实现,首先申请一个长度为256的表,对每个字符hash计数即可。因为C/C++中的字符有3种类型:char、signedchar和unsignedchar。char类型的符号是由编译器指定的,一般是有符号的。在对字符进行hash时,应该先将字符转为无符号类型;否则当下标为负值时,就会出现越界访问。此外,还需要一个数组记录当前找到的只出现一次的字符,避免对原字符串进行第二次遍历。代码如下:#include "stdafx.h"#include char GetChar(char str[]){ if (str == NULL) return 0; .
阅读全文
摘要:方法一:先求出字符串长度,然后反向遍历。代码如下:#include "stdafx.h"#include void ReversePrint(const char* s){ int len = strlen(s); for (int i = len - 1; i >= 0; i--) printf("%c", s[i]); }int main(){ char a[] = "abcd"; ReversePrint(a); printf("\n"); getchar(); return 0;} 效果如图: 方法二
阅读全文
摘要:思路分析:一共分两个步骤,第一步先按单词逆序,第二步将整个句子逆序。代码如下:#include "stdafx.h"#include void ReverseWord(char* p, char* q){ while (p < q) { char t = *p; *p = *q; *q = t; p++; q--; }}char* Reverse(char *s){ char *p = s; char *q = s; while (*q != '\0') { if (*...
阅读全文
摘要:方法一:普通逆序。直接分配一个与愿字符串登场的字符数组,然后反向拷贝即可。代码如下:#include "stdafx.h"#include char *Reverse(char *s){ char *q = s; while (*q)q++; q=q-1; char *p = new char[sizeof(char)*(q - s + 2)]; char *r = p; //逆序存储 while (q >= s) { *p = *q; p++; q--; } *p = '\0'; re...
阅读全文
摘要:思路分析:单词的数目可以由空格出现的次数决定。连续的若干空格作为出现一次空格,一行开头的空格不统计在内。如果测出一个字符是非空格,而它前面的字符是空格,则表示新的单词开始了,此时将单词计数器累加1。如果当前字符是非空格而其前面的字符也是非空格,则意味着仍然是原来那个单词的继续,计数器不应再累加1。设置一个标识判断前面一个字符是否为空格,将其初始化为0,表示前一个字符是空格。若遇到非空格字符,则将该标识设为1,表示前一个字符是非空格。代码如下:#include "stdafx.h"#define BUFFERSIZE 1024int main(){ char string[B
阅读全文
摘要:思路分析: 方法一:涉及到两个数,就要用到异或定理了:若a^b=x,则a=b^x,b=x^a。对于这道题,假设这两个数分别为a、b,将数组中所有元素异或之后结果为x,因为a!=b,所以x=a^b,且x!=0,判断x中位为1的位数,只需要知道某一个位为1的位数k,如00101100,k可以取2或者3,或者5.因为x中第k位为1表示a或b中有一个数的第k位也为1,假设为a,将x与数组中第k位为1的数进行异或时,也即将x与a以及其他第k位为1的出现过偶数次的数进行异或,化简即为x与a异或,最终结果即为b。程序示例如下:#include "stdafx.h"#include voi
阅读全文
摘要:思路分析:任何一个数字异或它自己都等于0,根据这一特性,如果从头到尾依次异或数组中的每一个数字,因为那些出现两次的数字全部在异或中抵消掉了,所以最终的结果刚好是那些只出现一次的数字。代码如下:#include "stdafx.h"#include int findNotDouble(int a[], int n){ int result = a[0]; int i; for (i = 1; i < n; ++i) result ^= a[i]; return result;}int main(){ int array[] = { 1, 2, 3, 2...
阅读全文
摘要:思路分析:可以与归并排序联系起来,给定两个变量A、B,变量A轮着存放:a*1,a*2,a*3,……变量组B轮着存放:b*1,b*2,b*3,……有两个整数i、j,分别代表A、B第i、j次存放的值,每次取A、B中的较小值,并将较小值的次数加一,然后继续比较。代码如下:#include "stdafx.h"#includevoid Generate(int a, int b, int N, int *Q){ int tmpA, tmpB; int i = 1; int j = 1; for (int k = 0; k < N; k++) { tmpA =...
阅读全文
摘要:思路分析:可以通过递归的方法实现调整:(1)将前n-m个元素的顺序颠倒。(2)将后面m个元素的顺序颠倒。(3)将n个元素的顺序全部颠倒。通过以上3个步骤的执行,就可以把数组的元素颠倒。代码如下:#include "stdafx.h"#include void func(int* start, int* end){ while (start < end) { int temp = *start; *start = *end; *end = temp; start++; end--; }}void f(int ...
阅读全文
摘要:方法一:老盆友快速排序法,代码如下:#include "stdafx.h"#include #include int int_cmp(const void *a, const void *b){ const int *ia = (const int *)a; const int *ib = (const int *)b; return *ia - *ib;}void Unique_QuickSortMethod(int *arr, int elements){ //C语言自带的排序函数 qsort(arr, elements, sizeof(int), int_...
阅读全文
摘要:思路分析:可以只通过一遍扫描数组即可找出数组中第二大的数,即通过设置两个变量来进行判断。首先定义一个最大变量来存储数组的最大值,初始值为数组首元素;另一个是第二大变量,用来存储数组中的第二大数,因其一定不能超过数组中的最大值,所以初始值可设为最小负整数-32767,然后遍历数组元素。如果数组元素的值比最大变量的值大,则将第二大变量的值更新为最大变量的值,最大变量的值更新为该元素的值;如果数组元素的值比最大变量的值小,则判断该数组元素的值是否比第二大变量的值大,如果大,则更新第二大变量的值为该数组元素的值。代码如下:#include "stdafx.h"#include co
阅读全文
摘要:思路分析:首先通过快速排序,然后对排好序的数组设置主比较游标与辅比较游标,主比较游标初始化为下标0,辅比较游标则从下标1开始递增,挨个与第一个元素比较。在比较的过程中,若遇到相等的,则辅比较游标继续向后走,直到遇到不相等的,将主比较游标后移一位,此时主比较游标指向的元素值就是重复的,需要将其替换掉。然后将辅比较游标指向的元素值赋给主比较游标代表的元素值。重复这样的过程,直到所有的重复元素都比替换掉,此时主比较游标代表的就是去重后数组的最大下标,将其加一即为去重后数组的长度。代码如下:#include "stdafx.h"#include #include int int_c
阅读全文
摘要:方法一:位图法,原理是首先申请一个长度为n且均为’0’组成的字符串,字符串的下标即为数组a[]中的元素,然后从头开始遍历数组a[N],取每个数组元素的值,将其对应的字符串中的对应位置置1,如果已经置过1,那么该数就是重复的数。由于采用的是位图法,所以空间复杂度比较大,为O(N).代码如下:#include "stdafx.h"#include #include bool xor_findDup(int * arr, int NUM){ int *arrayflag = (int *)malloc(NUM*sizeof(int)); int i = 1; while (i #
阅读全文
摘要:思路分析:类似快速排序的处理。可以用两个指针分别指向数组的头和尾,头指针正向遍历数组,找到第一个偶数,尾指针逆向遍历数组,找到第一个奇数,使用引用参数传值交换两个指针指向的数字,然后两指针沿着相应的方向继续向前移动,重复上述步骤,直到头指针大于等于尾指针为止。代码如下:#include "stdafx.h"#include using namespace std;void Swap(int& a, int& b){ int temp = a; a = b; b = temp;}void ReverseArray(int arr[], int len){ if
阅读全文
摘要:思路分析:尼玛这不就是等差数列么。首先将该n-1个整数相加,得到sum,然后用(1+n)n/2减去sum,得到的差即为缺失的整数。因为1~n一共n个数,n个数的和为(1+n)n/2,而未排序数列的和为sum,二者之差即为确实的数。程序示例如下:#include "stdafx.h"#include #define MAX 5int main(){ int array[MAX] = { 3, 2, 1, 6, 4 }; int i; int sum = 0; int temp; for (i = 0; i < MAX; i++) sum += i; temp = (MA
阅读全文
摘要:方法一:枚举法。该方法是最容易、也是最简单的方法,枚举出数组A和数组B中所有的元素对,判断其和是否为c,如果是,则输出。方法二:排序+二分查找法。首先,对两个数组中长度较大数组,不妨设为A,排序;然后,对于B中每个元素B[i]在A中二分查找c-B[i],如果找到,直接输出。方法三:排序+线性扫描法。首先,对A和B进行排序;然后用指针p从头扫描A,用指针q从尾扫描B,如果A[p]+B[q]==c,则输出A[p]+B[q],且p++,q--;如果A[p]+B[q]>c,则q--;否则p++。代码如下:#include "stdafx.h"#include void sor
阅读全文
摘要:一个整数数组,元素取值可能是1~N(N是一个较大的正整数)中的任意一个数,相同数值不会重复出现。设计一个算法,找出数列中符合条件的数对,满足数对中两数的和等于N+1。方法一:蛮力法。这是最简单的方法,枚举出数组中所有可能的数对,看其和是否为N+1,如果是,则输出。但这种方法一般效率不高。代码如下:#include "stdafx.h"#include int findCouple(int a[], int n, int &val){ if (a == NULL || n max) max = a[m]; } for (int i = 0; i N+1,则back--
阅读全文
摘要:给定一个含有n个元素的整型数组array,其中只有一个元素出现奇数次,找出这个元素。思路分析:这道题一般人的第一反应都是遍历数组,将数组中每个元素出现的次数保存下来,然后遍历这些次数,返回奇数者。时间复杂度O(n2),累不累啊。因为对于任意一个数k,有k^k=0,k^0=k,所以将array中所有元素进行异或,那么个数为偶数的元素异或后都变成了0,只留下了个数为奇数的那个元素。酱紫的话时间复杂度只有O(n),多省事啊。程序示例如下:#include "stdafx.h"#include int FindElementWithOddCount(int* a, int n){
阅读全文
摘要:一个整数数组,元素取值可能是0~65535中的任意一个数,相同数值不会重复出现;0是例外,可以反复出现。设计一个算法,判断这个数组中的元素是否连续相邻。需要注意以下4点:(1)数值允许是乱序的,如87506。(2)0可以通配任意数值,如87506中的0可以通配成9或者4.(3)0可以多次出现。(4)全0算连续,只有一个非0算连续。思路分析:如果没有0的存在,要组成连续的数列,最大值和最小值的差距必须是n-1;存在0的情况下,只要最大值可最小值的差距小于n-1就可以了,缺失的数值可以用0通配。所以找出数列中非0的最大值和非0的最小值,时间复杂度为O(n)。如果非0最大-非0最小+1bool Is
阅读全文
摘要:有一种非常诡异的算法,就是采用类似于单链表是否存在环的问题。“判断单链表是否存在环”是一个非常经典的问题,同时单链表可以采用数组实现,此时每个元素值作为next指针指向下一个元素。本题可以转换化为“已知一个单链表中存在环,找出环的入口点”这种想法。具体思路如下:将array[i]看作第i个元素的索引,即array[i]——>array[array[i]]——>array[array[array[i]]]——>array[array[array[array[i]]]]——>....最终形成一个单链表,由于数组a中存在重复元素,则一定存在一个环,且环的入口即为重复元素。所以
阅读全文
摘要:数组a[N],1至N-1这N-1个数存放在a[N]中,其中某个数重复一次,写一个函数,找出被重复的数字。要求每个数组元素只能访问一次,不用辅助存储空间。由于题目要求每个数组元素只能访问一次,不用辅助存储空间,可以从原理上入手,采用数学求和法,因为只有一个数字重复一次,而数又是连续的,根据累加和原理,对数组的所有项求和,然后减去1至N-1的和,即为所求的重复数。程序代码如下:#include "stdafx.h"#include void xor_findDup(int *a, int N){ int tmp1 = 0; int tmp2 = 0; for (int i =
阅读全文
摘要:方法一:每次取出两个不同的数,剩下的数字中重复出现次数超过一半的数字肯定,将规模缩小化。如果每次删除两个不同的数,这里当然不是真的把它们踢出数组,而是对于候选数来说,出现次数减一,对于其他数来说,循环遍历就行。在剩余的数字里,原最高频数出现的频率一样超过了50%,不断重复这个过程,最后剩下的将全是同样的数字,即最高频数。此算法避免了排序,时间复杂度只有O(n).程序示例如下:#include "stdafx.h"#include int FindMostApperse(int* num, int len){ int candidate = 0; int count = 0;
阅读全文
摘要:方法一:以空间换时间,可以定义一个数组intcount[MAX],并将其数组元素都初始化为0,然后执行for(inti=0;iindex) { index = arr[i]; num = i; } //printf("%d\n", num); } return index;}int main(){ int array[] = { 1, 1, 2, 2, 4, 4, 4, 4, 5, 5, 6,6 }; int length = sizeof(array) / sizeof(array[0]); int i; int num = 0; int* count = new int
阅读全文
摘要:例如,两个含有n个元素的有序(非降序)整形数组a和b(数组a和b中都没有重复元素),求出其共同元素。a[]={0,1,2,3,4};B[]={1,3,5,7,9};那么它们的交集为{1,3}。计算数组交集可以采用很多种方法,但数组的相对大小一般会影响算法的效率,所以需要根据两个数组的相对大小来确定采用的方法。(1)对于两个数组长度相当的情况,一般可以采取以下3种方法。方法一:采用二路归并来遍历两个数组。(这个名字好霸气,有木有武功招数的赶脚)设两个数组分别为array1[n1]和array2[n2],分别以i、j从头开始遍历两个数组。在遍历过程中,如果当前遍历位置的array1[i]与arra
阅读全文
摘要:思路分析:二分查找法也称为折半查找法,它的思想是每次都与序列的中间元素进行比较。二分查找的一个前提条件是数组是有序的,假设数组array为递增序列,findData为要查找的数,n为数组长度,首先将n个元素分成个数大致相同的两半,取array[n/2]与将要查找的值findData进行比较,如果findData等于array[n/2],则找到findData,算法终止;如果findDataarray[n/2],则只需要在数组array的右半部分继续搜索即可。这个“左半部分”、“右半部分”的确定,都需要两个参数:开始标记与结束标记,比如初始状态时,开始标记为下标0,结束标记为数组长度-1,序列的
阅读全文
摘要:思路分析:递归嘛之前数组求和已经见识到了,就是自己调用自己嘛。但是,这里一定要注意一点,凡是要求用“递归算法”的,你在递归之前一定要先分类讨论,判断一下当前条件是否允许递归,比如一个数组长度就是1,你用递归去判断它里面的某两个元素的大小,这就要出Bug了。还有既然递归的目的是判断,那要写的递归函数就是个bool类型的。最最重要的是,数组操作一定要注意下标越界问题,数组下标只能在0到数组长度减1之间的。代码如下:// 1314.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"void Judge(int *a, int n){ if (n =
阅读全文
摘要:思路分析:二维数组在内存中默认是按照行存储的,比如一个二维数组{{1,2,3,},{4,5,6}},它在内存中存储的顺序就是1、2、3、4、5、6,也就是说,对于这6个数组元素,按照从0到5给它们编号的话,从它们的编号都能推出它们在二维数组中的行号和列号,比如行号即为序号对列数的整数商,列号则为序号对列数取余。所以别说二维数组了,其它维数组也能用一个for循环打印出来。代码如下:// 1312.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include #define MAXX 2#define MAXY 3void printArr
阅读全文
摘要:思路如下:给定一个含有n个元素的整型数组a,求a中所有元素的和。问题的难点在于如何使用递归上。如果使用递归,则需要考虑如何进行递归执行的开始以及终止条件,首先如果数组元素个数为0,那么和为0。同时,如果数组元素个数为n,那么先求出前n-1个元素之和,再加上a[n-1]即可。此时可以完成递归功能。总之,递归就是在某个函数的执行过程中首先判断它的终止条件参数,终止条件参数满足终止条件则执行完毕,终止条件参数不满足终止条件则调用它自身执行某项运算,比如这里求和就是执行加法。凡是递归一定都有一个参数作为终止条件,比如这里是数组中未加入求和队列的元素个数,初始为数组长度。因为终止条件参数的初始值为数组长
阅读全文
摘要:在使用JDBC查询数据库中数据时,返回的结果是ResultSet对象,使用十分不方便。CommonsDbUtils组件提供了将ResultSet转化为Bean列表的方法,但是该方法在使用时需要根据不同的Bean对象创建不同的查询方法。本实例将在该方法的基础上使用泛型进行包装,使其通用性更强。思路分析:凡是要进行数据库操作的肯定都要额外导入包,比如mysql-connector-java-5.1.6-bin.jar与commons-dbutils-1.3.jar。我就很奇怪为毛JDK的默认包里不带这些呢。导入包的操作为在项目的“JRE系统库”选项上单击鼠标右键,选择构建路径——>配置构建路
阅读全文
摘要:Set是Java集合类的重要组成部分,它用来存储不能重复的对象。枚举类型也要求其枚举元素各不相同。看起来枚举类型和集合是很相似的。然而枚举类型中的元素不能随意的增加、删除,作为集合而言,枚举类型非常不实用。EnumSet是专门为enum实现的集合类,本实例将演示其用法。思路分析:可以通过为EnumSet指定类型,该类型即为在同一包中定义的枚举类。使用EnumSet类的add()方法添加元素,使用EnumSet类的remove()方法删除元素,使用EnumSet类的complementOf()方法获取对象的全部,使用EnumSet类的range()方法获取指定范围的元素。代码如下:Weeks.j
阅读全文
摘要:泛型是JavaSE5.0的重要特性,使用泛型编程可以使代码获得最大的重用。由于在使用泛型时要指明泛型的具体类型,这样就避免了类型转换。本实例将使用泛型来实现一个栈结构,并对其进行测试。思路分析:既然是用泛型实现栈结构,那就不能用JDK自带的stack包了,需要自己定义一个栈结构,比如LinkedList。代码如下:Stack.java:package cn.edu.xidian.crytoll;import java.util.LinkedList;public class Stack { private LinkedList container = new LinkedList...
阅读全文
摘要:在对大文件操作时,可能会需要些时间,此时为用户提供进度条提示是非常常见的一项功能,这样用户就可以了解操作文件需要的时间信息。本实例为大家介绍了在复制大的文件时使用的进度条提示,需要注意的是,只有在读取文件超过2秒时,才会显示进度条。、思路分析:因为既要有操作面板又要有进度条,所以肯定要出现两个继承JFrame类的窗体。先看被调用的进度条窗体,它不需要手动操作,所以类的内部实现一个方法就可以了。因为设计文件操作,所以要捕获异常。首先根据要复制的文件创建File对象,以及根据复制后文件的保存地址创建File对象,然后创建FileOutputStream对象,再创建FileInputStream对象
阅读全文
摘要:在获得一个以Zip格式压缩的文件之后,需要将其进行解压缩,还原成压缩前的文件。若是使用Java自带的压缩工具包来实现解压缩文件到指定文件夹的功能,因为jdk提供的zip只能按UTF-8格式处理,而Windows系统中文件名是以GBK方式编码的,所以如果是解压一个包含中文文件名的zip包,会报非法参数异常,如图所示: 所以要实现解压缩,就得对DeflaterOutputStream.java、InflaterInputStream.java、ZipConstants.java、ZipEntry.java、ZipInputStream.java以及ZipOutputStream.java这些相..
阅读全文

浙公网安备 33010602011771号