A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

/*
求          在一个已知的字符串中查找最长单词,假定字符串中只含字母和空格,空格用来分隔不同单词。
  
        解题思路  

首先  利用循环将数组所有空格位置 统计出来,放入一个整型数组;  如 "ab b CD"  先设定一个整型数组  存放字符串A[] 中空格的位置  首先第一个空格位置 A[0] 值设为0  
第一个空格位置A[1]为 3   第三个空格位置A[2] 为5 ; 单词长度用数组B[]存放   那么第一个单词ab 长度B[0]=A[1]-A[0]-1 =2   第一个单词吧长度B[1]=A[2]-A[1]-1 =1
那么第x个 单词长度B[X]=A[X+1]-A[X]-1    假如B[x]为最大值,即单词长度最长,只要知道B[X]值  就知道最大值的地址; B[X]=A[X+1]-A[X]-1 ,
则最大值对应的位置是在对应地址是p+A[x]
,同时然后利用地址,将下一个空格  即:地址为p+A[x+1]的空格,转换为\0,即可利用指针进行字符串输出 ;
*/
#include <stdio.h>
#include <string.h>
int main()
{

        char string[] =  "sdjf  sjfdgf gdgj dhd dffdhfsiuhef u"  ;
        char *p = string ;
        int num[30] ;
        num[0] = 0 ;//设第一个值为0
        int m = 1 ;
        int i=0 ; //定义在外面,最后确定最后一个字节位置

        for ( ; string[i] != '\0' ; i++) //逐个字符进行判断
        {
                if(string[i] ==  ' ')        // 如果是空格  记录空格位置
                {               
                        num[m] = i+1 ; // mum[i] 就是第i个空格位置  ,
                        m++ ;

                }
        }
        num[m] = i+1 ;//记录最后一个字符'\0'的位置 i+1 ,for循环以后m++,但没有执行mum[m]没有值,将\0 位置记录在mum[m]中
   int length[30] ;
   for(int a=0 ; a < m-1 ; a++ )  //将 各个字符串长度值依次输入数组中
   {
                length[a] = num[a+1]-num[a]-1;
   
   }
   int max(int ages[] , int m);  //声明一个 max函数  进行  最长字符循环判断   并返回最长字符串中a[i]的i值

   int x = max( length , m-1 ) ; //函数  调用返回值
   *(p+num[x+1]) = '\0' ;     //  将最长字符串 后面的空格 赋值为'\0' 作为字符串结束的标志,
   printf("%s\n",*(p+num[x])) ; //利用指针输出  
        return  0 ;
}


int max(int ages[] , int q)
{
        int j = 0 ;
        int max = 0 ;
        for (int s=0;s < q ; s++)
        {
                if( max < ages[s])  // 交换  将最大值的s放赋予j,并返回
                {
                        j= s  ;
                        max = ages[s] ;
        }
        return  (j) ;
}

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马