谁都不能阻挡你成为更优秀的人。
牛客网题目链接点我(作者的感悟在题目下面哈)
#include<stdio.h> int main() { char s[8000] = { 0 }; char* p = s; long long c = 0; long long ch = 0; long long chn = 0; scanf("%s", s); while (*p) { if ('C' == *p) { c++;//c 的个数 } else if ('H' == *p) { ch+=c; //因为遇到了h,而前面有多少个c,所以现在就有多少ch,chn也一样 } else if ('N' == *p) { chn+=ch; } p++; } printf("%lld ", chn); return 0; }
到这里题目就做完了,然后突然就想谈一点什么,当然上面这种方法我一开始是没有想出来的,可能也是和大家一样也会很麻烦,也可以说到现在也没有想明白,但可能也想明白的。或许你可能会很疑惑我说的话,想着这人神经病呀,搁着套娃呢,其实不是,这就要说到我想说的一些灵感了,这次也不是第一次,之前递归那段时间这种情况发生更多,而且我一直以为也只是递归那段时间可能才会有的,或者说用得到的。好了,别骂我了,现在就说,其实很简单就是去宏观地去看这一个问题,不要仔细去想这个问题的细节,当然我也不一定说得对,更多的是想来分享这一感触,这是我做了这么多天题的些许领会,又或者说个人认为收获最不一样最大的地方之一,当然我不是来误导别人的,只是说或许可以给你一个更好的思路,一个属于自己的做题思路(当然也有可能会有其他方面的思路,例如小项目?),这对于小白来的成长来说是非常重要的(最起码我自己觉得吧),当然你要是大佬就可以当我没说过,或许再过一段时间又会有不一样的感觉,哈哈。然后可能你现在读到这里有点懵,这人在说什么东西?我们来想一想场景吧,就比如这道题,反正作者笨笨的脑子到现在也没有想明白每一步是怎么得到的,但是如果用我刚才说的思路的话我就能很清晰得去想明白,而且也非常好写(递归也是这样),直接用一个指针,遇到c就++,然后遇到h,就c+=h就是现在ch的个数,然后又遇到h就再ch+=c,就相当于更新现在的ch的个数,然后再遇到n就是chn的个数了。为什么说递归我经常会有这种想法呢,就是因为递归的每一步怎么走的,怎么递出去的,怎么归回来的反正我是可以被绕晕的,你小一点还好,大一点就有点懵,当然递归就是大化小的思想,作者也会用这种也很好想,但是今天是来给大家分享宏观的思想的,就不说那个,作者做递归就可能会用这种宏观的思路(我需要干什么,只需要关键的哪几步就可以了,然后归的条件是什么),诈一听好像就是之前说的递归三问,又或者说大化小,这是因为代码可能写出来是一样的,但是思路不一样,或许大家一般也不会注意这个事情,但好像确实是这个样子。
啰啰嗦嗦说了一大堆有的没的,或许对你有用给了你一些新的想法,又或许没用还骂了我两句这人说的啥?但是这的确是作者临时起意的一种分享,还是希望对大家有用,总的来说就是可能做题做多了然后有着自己的一套思路体系吧。
最后的最后感谢大家的观看!要是觉得对你有用的话,就期待你的三连哈!
再次谢谢!!!