今天遇到的2个题目,我承认我才疏学浅,第二个做没做出来......

wonrowl 2013-10-17 05:07:43
加精
要求:
1 写一个函数实现一字符串的排序;字符串里的字符的个数未知且不允许计算字符串的长度,并优化它.

2 在一个字符串里查找另外一个字符串出现的次数,同样不能计算字符串的长度且只能用一层循环实现;并优化之.....


以上均不能调用现成的C库函数,用标准C语言完成..........

谁知道 啊 ,赐教....谢谢
...全文
8039 129 打赏 收藏 转发到动态 举报
写回复
用AI写文章
129 条回复
切换为时间正序
请发表友善的回复…
发表回复
todo9351 2015-06-16
  • 打赏
  • 举报
回复
不能用C库???? 那C语言考个毛啊,出题的人脑子有问题吧。考什么,考算法吗
Think_Idea 2015-06-15
  • 打赏
  • 举报
回复
可以尝试kmp算法
wq327 2015-06-15
  • 打赏
  • 举报
回复
第二题很简单啊:直接贴代码
int main()
{	
	char* p = "123 123 1234 12345 3123 6123 132";
	char* tem = "123";
	int number = 0;
	while(*p)
	{
		if (*p == *tem)
		{
			int count = 0;
			int flag = 1;
			while (*(tem + count) != '\0' && *(p + count) != '\0')
			{
				if (*(p + count) != *(tem + count))
				{
					flag = 0;
					break;
				}
				count++;
			}
			if (flag == 1)
			{
				number++;
				p = p + count;
			}else
				p++;
		}else
			p++;
	}
	return 0;  
}
楼主看可否满足条件
bedynamic 2014-01-26
  • 打赏
  • 举报
回复
好有难度啊!!!
iaccepted 2014-01-26
  • 打赏
  • 举报
回复
第一个题目的方法 把元素弄数组里,直接打出来就ok了

#include <stdio.h>
#include <string.h>

#define N 129

int main(){
	int i,j,a[N]={0};
	char str[N];

	scanf("%[^\n]%*c",str);

	for(i=0;str[i]!='\0';++i){
		++a[str[i]];
	}

	for(i=0;i<N;++i){
		for(j=0;j<a[i];++j){
			printf("%c",i);
		}
	}
	printf("\n");
	return 0;
}
cquptzzq 2014-01-25
  • 打赏
  • 举报
回复
引用 2 楼 nice_cxf 的回复:
1楼大概没仔细看,要求一层循环,这种题目不清楚要考什么,感觉没啥意义。。。
考的就是代码优化,大家都会暴力解决还要你做什么,越节约资源的人越是大牛
diggcat 2013-11-10
  • 打赏
  • 举报
回复
这个问题我觉得完全可以参考数据结构(C语言)版书籍,上面在讲表这一数据结构时,有讲到从长串中如何最低时间复杂度来查找子串,用的就是KMP算法,它也就是优化指针回遡,通过一个next函数,在查找子串较长时比较明显
僵尸男孩 2013-11-10
  • 打赏
  • 举报
回复
33L 的 “aaaaa” “aaa” 不能通过哦
引用 33 楼 kou753852951 的回复:
#include <stdio.h>
void fun(char *a, char *b)
{
	int num=0;
	char *s=b;
	int f=0;
	while(*a)
	{
		if(*a == *s)
		{
		//	printf("%c %c\n",*a,*s);
			if(*(s+1) == '\0')
			{
				++num;
				s=b;
			}
			else
				++s;
		 ++f;			
		}
		else
		{
		//	printf("%c %c\n",*a,*s);
			s=b;
			if(f != 0)
			{
				a-=f;
				f=0;	
			}				
		}
		a++;										
	}
	printf("%d",num);
			
}

int main()
{
	char *a="abdxabdxabca";
	char *b="abdxabc";	
	fun(a,b);
	getch();
} 
终极版,均可通过!
下面 是自己又更新的代码:
#include "stdio.h"


int main(int argc, char* argv[])
{
	const char *str="aaaa";
	const char *t="aaa";
	const char *p=t;
	int i=0;
	int j=0;
	int count=0;
	int count1=0;
	while (*str)
	{

		if(*str==*t)
		{
			t++;

			if(*t==NULL)
			{
				count++;
			}
		}
		else 
		{
			t=p;
			str=str-count1;
			count1=0;
		}
		str++;
		count1++;


	}
	printf("%d",count);
	return 0;
}
僵尸男孩 2013-11-10
  • 打赏
  • 举报
回复
int main(int argc, char* argv[])
{
	const char *str="AAB";
	const char *t="AB";
	const char *p=t;
	int i=0;
	int j=0;
	int count=0;
	while (*str)
	{
		if(*str==*t)
		{
			t++;

			if(*t==NULL)
			{
				count++;
			}
		}
		else 
		{
			t=p;
			str--;
		}
		str++;


	}
	printf("%d",count);
	return 0;
}
改进了一下 刚才的代码 若果 AAB AB 找不出来··
僵尸男孩 2013-11-10
  • 打赏
  • 举报
回复
感觉第2题 挺简单的··
int main(int argc, char* argv[])
{
	const char *str="good foor foo";
	const char *t="oo";
	const char *p=t;
	int i=0;
	int j=0;
	int count=0;
	while (*str)
	{
		if(*str==*t)
		{
			t++;
			if(*t==NULL)
			{
				count++;
			}
		}
		else 
			t=p;
		*str++;
	}
	printf("%d",count);
	return 0;
}
SciPioneer 2013-11-09
  • 打赏
  • 举报
回复
第二题感觉在KMP算法上稍微改改就好了。
small__student 2013-11-09
  • 打赏
  • 举报
回复
应用数据结构中串的模式匹配应该可以把
Anserhong 2013-11-02
  • 打赏
  • 举报
回复
a1053932351 2013-11-02
  • 打赏
  • 举报
回复
#include <stdio.h>

int main()
{
	int Count = 0; //存放查找到的次数
	int i; //存放现查到的位置
	int cnow = 0;//存放现照到第几个字符
	char bche[] = "abcabccdabc";//存放用来查找的字符串
	char che[] = "abc";//存放需要查找的字符串
	for(i = 0;bche[i] != 0;i ++)
	{
		if(che[cnow] != 0)
		{
			if(bche[i] == che[cnow])
			{
				cnow ++;
			}
			else
			{
				cnow = 0;
			}

		}
		else
		{
			Count ++;
			cnow = 0;
			i--;

		}
		if(bche[i+1] == 0 && che[cnow] == 0)
			Count ++;
			
	}
	return 0;
}
么京华 2013-11-01
  • 打赏
  • 举报
回复
引用 10 楼 qq523176585 的回复:
暂时只能想到这个,mark一下
#include <stdio.h>

int main(void)
{
	const char *str1 = "lamp hamp bamp namp amp apm";
	const char *str2 = "amp";
	int count = 0;
	int n;
	while(*str1)
	{
		for(n=0; *(str1+n) == *(str2+n); n++)
		{
			if (!*(str2+n+1))
			{
				count++;
			}
		
		}
		str1++;
	}

	printf("字符串str1包含 %d 个字符串str2 !\n",count);
	return 0;


}

这个真的不错 我想的是输入一个字符串用数组的方式存储,然后for循环一一比对。你这个方法更好
wostianzuo 2013-10-31
  • 打赏
  • 举报
回复
数据结构里面有个kmp算法,可以做第二个
  • 打赏
  • 举报
回复
// stringMatch.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "iostream"
using namespace std;

int StringMatch(char *p, char* s)
{
	int count = 0;
	char *head = s;
	while (*p != '\0')
		{
			if (*p == *s)
				s++;
			else
				s = head;
			p++;

			if (*s == '\0')
			{
				count++;
				s = head;
			}	

		}

	return count;
}
int main(int argc, char* argv[])
{
	char string[100];//带匹配字符串
	char pattrn[100];//模式串
	
	cin >> string;
	cin >> pattrn;

	cout << "匹配数" << StringMatch(string, pattrn);
	return 0;
}

jiandingzhe 2013-10-29
  • 打赏
  • 举报
回复
引用 18 楼 WhiteBird99 的回复:
第一题,没说清楚字符串内容.那么就认为全是ASCII字符,采用字典的方式进行计数,读到0为结束符. 构造一个数组,索引就是字符的ASCII码,例,从字符串中读到'A',数组索引为'A'的值+1. 读到0结束时,将数组每个元素代表的ASCII从头到尾按计数个数打一遍. 第二题,没想到一个循环怎么做.楼上几位的应该行,我先看看
有点作弊的思路:把两个循环硬合成一个,用一个flag表明自己在哪个的循环里。
无心雨云 2013-10-29
  • 打赏
  • 举报
回复
copy,copy
加载更多回复(104)

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧