zoukankan      html  css  js  c++  java
  • 北大OJ百练——3179:最长单词(C语言)

    废话不多说,先来上题目:



    OJ的这题关键在于如何计算我所选择的开始位置和结束位置。我用的方法是有4个参数来存储起来,start, buffStart, lenth, maxLenth.

    start: 记录总个字符串中最长的那个单词的开始的位置;

    buffStart: 记录当前位置的单词的开始位置;

    lenth: 记录当前位置的单词长度;

    maxLenth: 记录这个字符中最长的单词的长度。

    如果我们在循环的过程中遇到是字母,(如果此时的lenth的值为0,那么buffStart的值也会被修正为i在循环中的位置)那么我的lenth就是自增,并且判断些刻的lenth是否大于maxLenth,如果大,那么就把lenth的值给maxLenth,start的值修正为buffStart的值;如果我们在循环的过程遇到的不是字母,那么lenth就清零。

    如下是我的代码:

    #include <stdio.h>
    #include <string.h>
    #define LONGESTWORDS 200
    #define IS_LETTER 1
    #define NOT_LETTER 0
    
    int isLetter(char ch)
    {
    	if(('a' <= ch)&&(ch <= 'z') || ('A' <= ch)&&(ch <= 'Z'))
    		return IS_LETTER;
    	else return NOT_LETTER;
    }
    
    int main()
    {
    	char words[LONGESTWORDS];
    	int start, buffStart, lenth, maxLenth;
    	int i;
    	while(gets(words))
    	{
    		start = 0;
    		buffStart = 0;
    		lenth = 0;
    		maxLenth = 0;
    		for (i = 0; i < strlen(words); ++i)
    		{
    			if(isLetter(words[i]))
    			{
    				if(!lenth)
    				{
    					buffStart = i;
    				}
    				++lenth;
    				if(lenth >= maxLenth)
    				{
    					maxLenth = lenth;
    					start = buffStart;
    				}
    			}
    			else
    			{
    				lenth = 0;
    			}
    		}
    		for(i = start; i < start + maxLenth; ++i)
    		{
    			printf("%c", words[i]);
    		}
    		printf("
    ");
    	}
    	return 0;
    }

    当然,如果你不想去繁琐的用4个参数,也可以只用一个字符数组来解决问题,只要我们遇到的这个字母是单词的第一个字母,那么我们从这个字符数组的第一个位置开始赋值,直到遇到不是字母的为止,并在每次都在最后赋上一个''的结束符。这种方法可能更加简单一些,具体的实现我在这里就不多写了,感兴趣的朋友们可以尝试一下。




  • 相关阅读:
    sqlserver tips
    mysql tips
    小知识点集锦
    设计模式
    将微博或者qq空间的说说同步至博客园 wcf+js(ajax)跨域请求(1)
    WCF服务寄宿IIS与Windows服务
    C# 基础小知识之yield 关键字
    WPF命令绑定 自定义命令
    KnockOut 绑定之foreach绑定(mvc+knockout)
    P5019 铺设道路
  • 原文地址:https://www.cnblogs.com/fengju/p/6336172.html
Copyright © 2011-2022 走看看