zoukankan      html  css  js  c++  java
  • H面试程序(28):字符串处理转换

    //2 字符串处理转换
    //问题描述:    
    //在给定字符串中找出单词( “单词”由大写字母和小写字母字符构成,
    //其他非字母字符视为单词的间隔,如空格、问号、数字等等;另外单个字母不算单词);
    //找到单词后,按照长度进行降序排序,(排序时如果长度相同,则按出现的顺序进行排列),
    //然后输出到一个新的字符串中;如果某个单词重复出现多次,则只输出一次;
    //如果整个输入的字符串中没有找到单词,请输出空串。输出的单词之间使用一个“空格”隔开,最后一个单词后不加空格。
    //要求实现函数:
    //void my_word(charinput[], char output[])
    //【输入】  char input[], 输入的字符串
    //【输出】  char output[],输出的字符串
    //【返回】 无
    //示例
    //输入:charinput[]="some local buses, some1234123drivers" ,
    //输出:charoutput[]="drivers local buses some"
    //输入:charinput[]="%A^123 t 3453i*()" ,
    //输出:charoutput[]=""
    #include<stdio.h>
    #include<assert.h>
    void my_word(char input[ ], char output[ ])
    {   
    	assert(input);
        assert(output);
    	int flag = 1;//一个标识,为1表示遇到了非字母的字符
    	int i = 0;   //作为扫描字符串的标识
    	int newp = 0; //作为存放调整后字符串的标识
    	
    	//把字符串进行扫描,变成英语的句式  “(单词1)_(单词2)+(单词3)”	中间的间隔式非字母字符
    	while(input[i] != '') //此处i作为一个扫描指针,newp作为一个调整后的指针,存放符合要求的字符
    	{
    		if(( (input[i] < 'A' )||(input[i] > 'Z'&&input[i]<'a') || ( input[i] >'z'))&& (flag == 1) )//之前遇到了非字母,现在遇到的是非字母
    		{
    			i++;
    		}
    		else if(((input[i] >= 'a' && input[i] <= 'z') || (input[i] >='A'&& input[i] <='Z'))&& (flag == 1) )//之前遇到了非字母,现在遇到的是字母
    		{                    
    			input[newp++] = input[i++] ;		   
    			flag = 0;
    		}
    		
    		else if (  ((input[i] >= 'a' && input[i] <= 'z') || (input[i] >='A'&& input[i] <='Z'))&& (flag == 0) )//之前遇到了字母,现在遇到的是字母
    		{
    			input[newp++] = input[i++];			 
    		}
    		else //之前遇到了字母,现在遇到的是非字母
    		{        
    			input[newp++] = input[i++] ;
    			flag = 1;	
    		}
    	}
    	
    	input[newp] = '';
    	printf("%s
    ",input);	//输出调整后的字符	  
    	
    	
    	
    	int NumOfNotchar = 0 ;//统计出字符串中的单词数,NumOfNotchar+1
    	i = 0;
    	while(input[i] != '' )
    	{	 
    		if( (input[i] < 'A' )||(input[i] > 'Z'&&input[i]<'a') || ( input[i] >'z')) //通过非字母的个数来判断调整后单词的个数
    			NumOfNotchar++;
    		i++;
    	}
    	newp = 0; 
    	int lastpos = 0;  //存放之前字符串中最长单词的长度的位置
    	int lastlength = 0;  //存放之前字符串中最长单词的长度
    	for(int n = 0; n < NumOfNotchar ; n++ )  //
    	{
    		i = 0;
    		int maxlength = 0; //存放当前字符串中最长单词的长度
    		int length = 0;  //记录单词的长度
    		int maxpos = 0;//存放当前字符串中最长单词的长度的位置
    		int flag2 = 0;  //作为一个标识,判断当前单词与上一个单词是否一样
    		
    		
            //当前字符串中的最个数
    		int Numofinput = 0;    
    		while(input[i] != '' )
    		{
    			Numofinput++;
    			i++;
    		}
    		
    		
    		i = 0; //作为扫描字符串的指针
    		int prepos = Numofinput; //prepos存放(再长度相同情况下最前面)最长单词的起始位置
    		
    		while(i <= Numofinput )
    		{
    			if( ((input[i] >= 'a' && input[i] <= 'z') || (input[i] >='A'&& input[i] <='Z')) ) //遇到的是字母
    			{   
    				length++;
    				i++;
    				continue;
    			}
    			else if (length >= maxlength && length!=1 )  //遇到非字母了
    			{
    				
    				i++;
    				
    				maxpos = i-length-1 ; //暂时存放当前最大的单词的起始位置
    				if( length > maxlength)  //除非你比最大的长度还大,否则不改变prepos起始位置,prepos存放(再长度相同情况下最前面)最长单词的起始位置
    				{
    					prepos = maxpos;  
    				}
    				
    				maxlength = length;  
    				length = 0;
    				
                    
    				if( maxlength == lastlength  ) //如果当前的最长字符和之前的字符等长,判断是否相等
    				{      
    					for(int j = 0; j<maxlength; j++)
    					{
    						if(input[(prepos+j)] == output[(lastpos+j)])
    						{  
    							;
    						}
    						else                 //说明当前字符和之前的字符是不相等的
    							break;
    						
    					}
    					if (j == (maxlength )) //说明当前字符和之前的字符是相等的
    						flag2 = 1;		  
    					continue;
    				}
    			}
    			else   //遇到非字母了,但是之前的单词没有maxlength长
    			{
    				i++; 
    				length = 0;
    			}
    		}
    		
    		if( flag2 != 1 )  //如果当前字符和之前的字符是不相等,就将这个字符放入output中
    		{
    			int j = newp;
    			lastpos = newp;
    			lastlength =  maxlength;
    			for(j =prepos; j < (prepos+maxlength); j++ )
    			{
    				output[newp++] = input[j];
    			}
    			output[newp++] = ' ';
    		}
    		//把这个单词去掉
    		int start = prepos;
    		int end = prepos + maxlength;
    		
    		if(input[ end]== '')  //如果只剩下一个空字符串了
    		{
    			input[ start] = input[end];
    			input[start-1]='';
    		}
    		else   //把当前后面的到结尾全部往前移
    		{   
    			start--;
    			while(input[ end]!= '')
    			{
    				input[ start++] = input[end++];
    			}
    			input[start]='';
    		}
    	}
    	
    	output[newp] = '';
    	printf("%s
    ",output);
    }
    int main()
    {
    	char input[] = "some local buses, some1234123drivers max max";
    	char output[1000];
    	printf("%s
    ",input);
    	my_word(input, output); 
    	return 0;
    }


  • 相关阅读:
    L2TP协议
    PPP协议
    centos 更新linux内核
    关于GRUB2
    误删除libc.so.6 恢复
    LVS DR模式 负载均衡服务搭建
    进程地址空间分布和可执行文件分布
    centos 开机启动服务
    【netcore基础】ConcurrentDictionary 使用字符串作为key给代码加锁且使用EF事物防止并发调用数据混乱的问题
    【年终总结】个人的2018年年终总结
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3320212.html
Copyright © 2011-2022 走看看