c语言基础
小强_加油
这个作者很懒,什么都没留下…
展开
-
删除字符串开始及末尾的空白符,并且把数组中间的多个空格(如果有)符转化为1个
删除字符串开始及末尾的空白符,并且把数组中间的多个空格(如果有)符转化为1个////////////////////////////////////////////////////////////////////////////删除字符串开始及末尾的空白符,并且把数组中间的多个空格(如果有)符转化为1个void Delete_Space(char *s){ char *p_h;原创 2012-09-26 21:24:22 · 1184 阅读 · 0 评论 -
c语言字符串处理-----压缩字符串
马上要毕业了,最近一段时间一直看一些c语言基础的东东。打算从今天开始把最近的一些所得写出来和大家分享。今天先写一段关于字符串压缩的程序。简单来说就是,把一段如"aaaaabcccddde“,写成“a5b1c3d3e1”的字符串。代码如下void yasu(char *s){ char *p; char reschar[100];//存放压缩后的字符串 memset(re原创 2012-09-03 20:26:17 · 4410 阅读 · 2 评论 -
有两个序列A和B,A=(a1,a2,...,ak),B=(b1,b2,...,bk),A和B都按升序排列,对于1<=i,j<=k,求k个最小的(ai+bj),要求算法尽量高效
基本思路和上一篇是一样的:1:申请个K大小的辅助数组。2:给辅助数组赋值,并且进行从小到大的排序3:依次用后面的数字和与辅助数组的最大数进行比较,如果小于则把辅助数组的最大数替换,大于的话,则进行下一个比较代码的效率不高,谁有好的方法请指点:#define Min_Kij 5void Binsert_Kij(int *array) //对辅助的数组进行插入排序{原创 2012-10-08 09:36:46 · 6904 阅读 · 1 评论 -
分层打印二叉树
分层打印出二叉树的节点,在本文中的解题思路是,把二叉树的节点放到一个对应的数组中,然后打印出数组。在这里重要的是怎样把二叉树的节点数值放到对应的数组中。 图 1满二叉树上图是满二叉树的图形,可以看到不同的借点所对应的位置。我们要做的就是把节点放到数组中。比如,把“i”节点中的数值放到原创 2012-09-17 11:44:08 · 1787 阅读 · 0 评论 -
对一个正整数作如下操作:如果是偶数则除以2,如果是奇数则加1,如此进行直到1时操作停止,求经过9次操作变为1的数有多少个?
代码如下:如有问题请指示void Print_9(){ int count=0,temp; for (int i=0;i<10000;i++) { temp=i; for (int j=0;j<9;j++) { if (temp%2==0) { temp/=2; count++; if (temp==1&&cou原创 2012-10-08 21:39:36 · 5106 阅读 · 0 评论 -
/有一个函数fun能返回0和1两个值,返回0和1的概率都是1/2,问怎么利用这个函数得到另一个函数fun2,使fun2也只能返回0和1,且返回0的概率为1/4,返回1的概率为3/4
int Fun2() //这是1/4和3/4的。{ srand((unsigned)time(NULL)); int a=Fun1()*(rand()%7+1);//a为0的概率是1/2, 为数字的概率也是1/2.产生1到8之间的数字 if (a!=0) { if (a%2==0) //为偶数的概率是1/2*1/2 { return 0; }原创 2012-10-03 10:45:32 · 2662 阅读 · 7 评论 -
输出字符串中没有重复的字符,比如“baaca”,则会输出“bac”
原来打算用hash直接对应,但是那样会把顺寻改变。下面给出两个程序,一个用hash,一个不是:请大家分析//输入一个字符串中没有重复的字符如“abbbc”输出abcvoid Repeat_to_Signal(char *s){ int hash[50],index; memset(hash,0,sizeof(hash)); for (int i=0;i<strlen(s);原创 2012-10-09 22:00:35 · 1007 阅读 · 0 评论 -
有个序列数组Seq={a,b,c,d,aa,ba,ca,da,ab,bb,cb,db,ac,bc,cc,dc,ad,......aaa,baa,caa,daa,aba,bba,cba,dba.....
这是阿里的最新考题,下面的代码把所需要的字符串打印出来。如有其他的问题可以对下面的代码进行修改,来提供其他功能。从题中可以看到,字符的增长呈4倍变化。意思就是第一次是四个,第二次是16,依次就是64,128,...........................。从上面的而且有一定的规律性void Seq_String(){ char str[1100][10]; //申请一个二位原创 2012-10-11 15:24:54 · 5296 阅读 · 0 评论 -
a是n位二进制,b也是n位二进制数。c是n+1位二进制数字。求出c=a+b的计算过程
//二进制加法void Add_Bit(int *a,int *b,int n,int *c){ int temp1=0,temp2=0; //temp1为两个相加的和,temp2代表进制的数字 //int c[5]; int p=n-1; for (int i=n-1;i>=0;i--) { temp1=a[i]+b[i]; if (temp1+temp2原创 2012-10-13 23:31:22 · 1929 阅读 · 0 评论 -
将一句话的单词进行倒置
比如说一句话,“I love you!”变成“you! love I”,char *Reverse(char *s){ int n=strlen(s); char temp[1000];//定义缓冲区的的大小 int q=n-1; temp[n]='\0'; //最后一个为‘\0’ char *p; p=s; int i=0,t=0; bool flag=原创 2012-09-23 21:04:48 · 961 阅读 · 0 评论 -
通过移位把十进制转换成二进制和十六进制
这个试题可以充分考到个人对以为和与的操作char *int_to_bit(long data){ int bit_num=sizeof(long)*8; char *temp_bit=(char*)malloc(bit_num+1); temp_bit[bit_num]='\0'; for (int i=0;i<bit_num;i++) { temp_bit[i]原创 2012-09-24 21:49:45 · 1679 阅读 · 0 评论 -
用1、2、2、3、4、5这六个数字,写一个main函数,打印出所有不同的排列
用1、2、2、3、4、5这六个数字,写一个main函数,打印出所有不同的排列,如:512234、412325等,要求:"4"不能在第三位,"3"与"5"不能相连.。我弄了一个很笨 的办法。 void Print_Int(int *s) { //enum number{zero,one,two,three,four,five}; int i,j,k,l,m,n,pre;原创 2012-09-26 09:29:29 · 965 阅读 · 0 评论 -
对称子字符串的最大长度
输入一个字符串,输出该字符串中对称的子字符串的最大长度。比如输入字符串“google”,由于该字符串里最长的对称子字符串是“goog”,因此输出4 //对称子字符串的最大长度bool Symmetric_String(char *s) //判断字符串是否对称{ int d=strlen(s); char *temp=(char*)malloc(sizeof(char)*(d+1))原创 2012-09-25 13:32:29 · 622 阅读 · 0 评论 -
全排列的非递归打印
从1到N,输出全排列,共N!条。分析:用N进制的方法。设一个N个单元的数组a用来存放待全排列的数组的下标,对第一个单元做加一操作,满N进一。每加一次一就判断一下各位数组单元有无重复,有则再转回去做加一操作,没有(且数组a中没有值为N的元素)则说明得到了一个排列方案。例如:求1-3的全排列,共3!条设数组初始状态为0 0 0,以下为计算全排列的步骤:0 0 0 +11 0 0 +原创 2012-10-23 23:10:33 · 605 阅读 · 0 评论 -
顺时针输出数组
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。例如:如果输入如下矩阵:1 2 3 45 6 7 89 10 11 1213原创 2012-09-15 19:18:03 · 745 阅读 · 0 评论 -
有两个双向循环链表A,B,知道其头指针为:pHeadA,pHeadB,请写一函数将两链表中data值相同的结点删除。
程序写的比较混乱,而且没有考虑程序运行的效率。如有问题,请大家共同讨论struct DNode{ DNode *pre; DNode *next; int data;};typedef DNode* DNodeTree; void ShanChu(DNodeTree &phead1,DNodeTree &phead2){ int temp1=0,temp2=0;原创 2012-09-15 11:15:24 · 2170 阅读 · 1 评论 -
复制一个链表
typedef struct LNode{ int data; LNode *next; //指向下一个 LNode *Random; //随意指向一个节点}Lnode,*LinkList; ////////////////////////////////////////////////////////////////////////////复制链表原创 2012-09-27 17:32:23 · 1233 阅读 · 0 评论 -
求数组(元素可为正数、负数、0)的最大子序列和,
//求数组(元素可为正数、负数、0)的最大子序列和。这题和求最大对称子字符串类似,可以对照前面的求取最大对称子字符串的长度来理解#define Substring_legth 8int Substring_Sum(int *s){ int sum=0,Sub_sum=-100000; for (int i=Substring_legth;i>-1;i--) { f原创 2012-09-27 11:43:10 · 1154 阅读 · 0 评论 -
找出字符串中出现重复而且长度最长的字符串,并且输出而且输出其长度
下面是我写的函数,没有考虑运算的时间。第一个是计算出字符串中出现的子字符串出现的次数,int Compare(char *s,char *c){ char *p=c; int n=0; int p1=strlen(c); int i=p1; while(true) { if (*s==*c) { s++; c++; i-原创 2012-09-12 10:06:57 · 2418 阅读 · 2 评论 -
链表相邻元素翻转,如a->b->c->d->e->f-g,翻转后变为:b->a->d->c->f->e->g
链表相邻元素翻转,如a->b->c->d->e->f-g,翻转后变为:b->a->d->c->f->e->g struct DNode{ DNode *pre; DNode *next; int data;};typedef DNode* DNodeTree;//////////////////////////////////////////////////////原创 2012-09-27 11:50:30 · 2174 阅读 · 0 评论 -
将一个字符串中的大写字母放到小写字母的后面,而且移动后相对顺序不改变
这个题目有很多方法,为了复习栈的应用。我用栈作为缓冲区,进行调序。采用的是顺序栈// 初始化一个顺序栈#define MAX_SIZE 100//初始栈的大小void IniqStack(qStack &s){ s.i=0; s.base=s.top=(Stack*)malloc(sizeof(Stack)*MAX_SIZE);// s.stack_size=MAX_SIZ原创 2012-09-30 16:01:39 · 1565 阅读 · 0 评论 -
字符串循环移位
字符串左移,void *pszStringRotate(char *pszString, int nCharsRotate),比如ABCDEFG,移3位变DEFGABC,要求空间复杂度O(1),时间复杂度O(n)//////////////////////////////////////////////////////////////////////////////字符串移位,void原创 2012-09-30 22:39:19 · 604 阅读 · 0 评论 -
//实现一个atoi的函数,atoi是将字符串转换成整数
int string_to_int(char *s){ int sum=0,i=0; char *p=s; while(*p!='\0') // 出现“.”的情况 { if (*p=='.') { break; } p++; i++; } for (int j=0;j<i;j++) { sum=sum*10+(s[j]原创 2012-10-03 21:34:30 · 756 阅读 · 0 评论 -
单链表变形 如 1 2 3 4 5 变为 1 3 5 4 2 如1 2 3 4 变为 1 3 4 2
单链表变形 如 1 2 3 4 5 变为 1 3 5 4 2 如1 2 3 4 变为 1 3 4 2 (就是拆分链表 把偶数为反过来接在奇数位后面)基本思路是,先把链表分成两个部分,即偶数节点部分和奇数节点部分。然后,把偶数节点部分的链表进行逆序,然后连接到奇数节点部分的链表。代码如下void Reverse_Link(LNode *&head) //把一个链表逆序的函原创 2012-10-03 22:50:07 · 1043 阅读 · 0 评论 -
输入两个整数 n 和 m,从数列1,2,3.......n 中随意取几个数,使其和等于 m
这个程序的基本思路是从1开始寻找,寻找里面含有1的组合。当寻找结束后,寻找含有2的组合,然后依次进行下去。 #define N_Length 10 //定义一组1到n的数字,在这里定义到10int res[N_Length]; //定义一个辅助数组,void dfs1(int m, int t,int n,int dep) //t是从1开始,dep是辅助数组的下标{ for (原创 2012-10-03 15:30:14 · 2055 阅读 · 0 评论 -
一个数组里,数都是两两出现的,但是有三个数是唯一出现的,找出这三个数
一个数组里,数都是两两出现的,但是有三个数是唯一出现的,找出这三个数,这一题的基本用法和上一个字符匹配是相同的同样使用hash表。void Single_Num(int *s){ int hash[10]={0}; for (int i=0;i<M;i++) //M为数组的长度 { int index=s[i]-0;//只考虑9以内的数字,所以,减去了0 hash[原创 2012-09-29 10:56:22 · 3115 阅读 · 4 评论 -
二叉树查找不严格小于一个值的最大值(返回节点)。
查找一个不严格的小于一个值的节点,就是当二叉树中存在这个节点的时候。直接查找出来,当二叉树中不存在这个节点的时候查找比这个节点小的,但是在所有小于所查节点中的最大节点。这个程序中使用了栈进行中序遍历。代码如下: typedef struct BiTNode{ int data; struct BiTNode *lchild,*rchild;}*BiTree;struc原创 2012-10-04 18:10:38 · 2596 阅读 · 1 评论 -
3的方幂及不相等的3的方幂的和排列成递增序列1,3,4,9,10,12,13……,写出数列第300项
3的方幂及不相等的3的方幂的和排列成递增序列1,3,4,9,10,12,13……,写出数列第300项很简单的一道题,考查的不深void print_300(){ int i=0,j=0,k=0; int n=0,time=0,t; int a[320]; for (j=0;j<320;j++) { a[j]=1; } while(true) {原创 2012-10-05 18:11:32 · 4201 阅读 · 4 评论 -
n个数,找出其中最小的k个数,写出代码,要求最坏情况下的时间复杂度不能高于O(n logk)
这个问题好多人使用了最大堆的排序方式,因为我对最大堆不是很了解所以使用了数组。基本思路是,1:申请一个k大小的辅助数组,然后取数组中的个值赋值给辅助数组,为了方便,取了数组的前k个数字赋给辅助数组。2:对辅助数组进行排序,从小到达排列。3:用数组中的数字分别和辅助数组的最大值进行比较,如果小于辅助数组的最大值则,辅助数组中的最大值替换,之后对辅助数组进行排序。下面的过程就是不断的用数组原创 2012-10-05 22:30:01 · 3649 阅读 · 0 评论 -
给出一个数组,打印出这个数组的所有的子数组
给出一个数组,打印出这个数组的所有的子数组,比如,数组A={1,2},则它的子数组是1,2,{1,2}////////////////////////////////////////////////////////////////////////////一个数组中,打印出这个数组的所有组合void Print_Combination(int *array,int n){ //i原创 2012-10-23 19:44:03 · 1792 阅读 · 0 评论