• 北大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个参数,也可以只用一个字符数组来解决问题,只要我们遇到的这个字母是单词的第一个字母,那么我们从这个字符数组的第一个位置开始赋值,直到遇到不是字母的为止,并在每次都在最后赋上一个''的结束符。这种方法可能更加简单一些,具体的实现我在这里就不多写了,感兴趣的朋友们可以尝试一下。




  • 相关阅读:
    openwrt编译出错处理记录
    转:小白编译openwrt固件教程
    转:openwrt中luci学习笔记
    (转)内存和外设的统一编址及独立编址
    (转)无法打开C盘,提示"本次操作由于这台计算机的限制被取消,请与你的管理员联系”
    (转)c# 解析JSON的几种办法
    计算机中断(转贴,很经典的解释)
    转:用WCAT进行IIS压力测试
    转:windows命令行下如何查看磁盘空间大小
    转:如何在32位程序中突破地址空间4G的限制
  • 原文地址:https://www.cnblogs.com/fengju/p/6336172.html
Copyright © 2020-2023  润新知