zoukankan      html  css  js  c++  java
  • Length of Last Word

    
    
     1 class Solution {
     2 public:
     3     int lengthOfLastWord(const char *s) {
     4         int length=0;
     5         int i=0;
     6         int n=0;//存储遇到空格之前的word的长度
     7         if(s!=NULL)
     8         {
     9             
    10             while(s[i]!='')
    11             {
    12                 while(s[i]!=' ')
    13                 {
    14                     n++;
    15                     i++;
    16                 }
    17                 length=n;
    18                 n==0;
    19             }
    20         }
    21         return length;
    22     }
    23 };

    Time Limit Exceeded


    不止超时,程序也不对,我本来想着是用一个变量n记录上一个word的长度,然后把n赋给length,然后遇到空格就把n清零

    其实即使这样也不对,因为如果最后那个没有空格,那就返回的是倒数第二个word的值了。

     C++中有函数可以去除首尾空格,并将字符串按一定格式分割。

    刚才和实验室的同学讨论,他说可以从后向前,对呀,这个想法太好了,呵呵

    PS:又谈到几个题,数组中的数都是重复2次出现,只有一个是出现了一次,怎么找出那个数,

    我说可以先排序,然后设置两个指针就行了,时间复杂度O(nlgn)

    他说时间复杂度和空间复杂度都是O(1)的,所有数据异或操作就行了,异或操作可以交换次序的,也不用事先排序了。

    可以扩展为所有出现2次,只有2个出现1次,还有所有出现3次,只有一个出现一次等等,当然解法不同了。

    又说道另外一个题,怎么判断一个链表是否有环。记录所有扫描的指针,扫描下一个时查看是否之前扫描过,这种方法显然不行的。

    他说可以设置两个指针,快的在前,慢的在后,当快的跑到慢的后面的时候说明有环。

    好了,言归正传

     1 class Solution {
     2 public:
     3     int lengthOfLastWord(const char *s) {
     4         int length=0;
     5         if(s!=NULL)
     6         {
     7             const char *p;
     8             p=s;
     9             while(*s!='')
    10             {
    11                 s++;
    12             }
    13             s--;
    14             /*
    15             while(*s!=' ')
    16             {
    17                 length++;
    18                 s--;
    19             }//这样写,错误,eg:"a",根本就没有空格,说明循环判断的条件不对
    20             */
    21             while((*s!=' ')&&(s>=p))//因为s--了,所以不能是s==p来判断
    22             {
    23                 length++;
    24                 s--;
    25             }
    26         }
    27         return length;
    28     }
    29 };

    Status: 

    Wrong Answer

    Input: "a "
    Output: 0
    Expected: 1

    我在codeblocks中试了,是可以的,不知道为什么在leetcode上没有通过。

    网上查找了一下,发现其实还是想的不周到,既然从后向前,那么后边的空格应该先去掉的,若输入"a  "那么我写的结果就会是错的。

    需要在上面代码21行之前加上下面几句话就AC了

                while(*s==' ')
                {
                    s--;
                }
  • 相关阅读:
    实现继承的几种方式
    使用 + 操作符、parseInt 、 parseFloat等方法处理数字字符串时的不同
    jQuery插件版无缝轮播,重写了之前的代码,显得更高大上一点
    我是如何从零开始构建一个jsp项目的
    css居中方法详解
    嫌innerHTML性能不够好,推荐几个新方法
    初学事件委托
    Set集合——HashSet、TreeSet、LinkedHashSet(2015年07月06日)
    十大Intellij IDEA快捷键(转)(2015年06月15日)
    IntelliJ IDEA 集成Tomcat后找不到HttpServlet问题(2015年06月13日)
  • 原文地址:https://www.cnblogs.com/crane-practice/p/3584073.html
Copyright © 2011-2022 走看看