最近是有总喜欢讨论算法题,因为他们在准备考研复试,为什么我不准备呢?这是一个悲伤的故事,刚好自己也有面试遇到只能使用C和C++的代码题,他们说这OJ平台相对简单一些,那些刷不来LeetCode可以试试这个,作为入门算法的跳板。体验体验写不出来或者找不到bug的那种感觉,避免入职第一天觉得顶不住压力,说实话,前端更偏向于业务,往往就是搜索——看看配置方式——总结或者深究原理(陈然很多时候我们都没有这最后一步,前端也就成了专业码砖的了)。一旦遇到某些bug解决不了或者某些功能没有实现的思路往往一下子上头。作为菜鸡,试了试浙江工商的这个还是挺适合我的,举出例子让前端编程弱的友友们了解一下吧。
浙江工商大学OJ平台,链接:http://acm.zjgsu.edu.cn/
,我们学校也有,大一也做了一些,但是没能坚持下去,算法需要足够的毅力才能有一些证书上的成果。当然也不必因为觉得算法不好而自卑,各有所长很正常,计算机越学越广。
题目简介:
思路上还是很好想出来的,关键是容错处理,首部和尾部的空格(可能是连续的无效空格),最后的解决思路是:
(1)首先排除首部的无效空格,然后再来计数;立一个flag,如果头部一直是空格,那么flag一直不变,出现字符反转flag,也就是有单词。
(2)中间计数:如果前面一个是空格,后一个不是空格,那么计数一次;
(3)后置处理:如果最开始设置的flag没有反转过,那就是都是空格,也就是没有单词;如果有单词,那么需要最后在计数的基础上+1,因为判断是基于单词空格
判断的。
简单贴一下代码吧:
#include//算法的万能头
using namespace std;
int main() {string str;int num = 0;getline(cin, str);int len = str.length();int flag = 0;for (int i = 0; i < len; i++) {//去掉首部的空格if (!flag && str[i] == ' ') {continue;} else {flag = 1;if (i > 0 && (str[i - 1] == ' ' && str[i] != ' ')) {num++;}}}if (!flag)cout << 0 << endl;else {cout << num + 1 << endl;}return 0;
}
其实主要是想说这个,有点东西的:
如果没有踩到坑或者没有仔细复盘可能不知道里面的坑,大概也就是为什么这题的通过率这么低。注意题意的理解,先找最小值再交换,再找最大值再交换,注意第二次是对交换之后的数据进行操作。很多人估计和我一样:这还不简单,直接遍历一次,找出最大最小值的下标交换,完事了,但是一直有部分样例没有通过。
其实原因是:同时遍历再交换和两次有先后顺序的处理是不一样的,最后我通过复盘找到了一组数据:4 3 1
(题目保证输入数据不重复),如果是同时遍历再交换,那么执行流程将是如下的情况:
(1)找到最小最大值下标(题意要求先换小的),也就是下标对应于2
和0
;
(2)交换最小值位置,由于最小的数不在第一个位置,交换变成了1 4 3
;
(3)交换最大值位置,由于最大的数据不在最后的位置,交换变成了3 4 1
(是的,变回去了)。
然而如果按照题意的两次,第一次交换也就是第一次交换最小值,变成了:1 3 4
,第二次交换最大值,也就是不变了。有点东西,算法还是不能想当然,不然怎么错的都得想半天。
下一篇:L1正则化与L2正则化