请教算法怎么入门??? 每次鼓起勇气上 leetcode 后,都要怀疑自己的智商。

2016-05-10 08:52:04 +08:00
 ren2881971

比如 这道题(据说很简单)

Given an array and a value, remove all instances of that > value in place and return the new length.

The order of elements can be changed. It doesn't matter what you leave beyond the new length. 以下是答案。

class Solution {
public:
    int removeElement(int A[], int n, int elem) {
        int i = 0;
        int j = 0;
        for(i = 0; i < n; i++) {
            if(A[i] == elem) {
                continue;
            }

            A[j] = A[i];
            j++;
        }

        return j;
    }
};

我不明白为什么要加 A[j] = A[i]; 这行代码。 真心请教怎么入门。。

14746 次点击
所在节点    算法
71 条回复
21grams
2016-05-10 10:07:21 +08:00
写不出来很正常,经验问题,但这种程度的代码都看不懂我觉得你需要思考一下职业规划。
jasonlz
2016-05-10 10:16:09 +08:00
leetcode 上大多数题目都不需要很复杂的算法,基本上数据结构学的可以就可以解决大部分问题了。
ren2881971
2016-05-10 10:22:31 +08:00
ren2881971
2016-05-10 10:23:52 +08:00
@21grams 职业规划没问题~ 目前尚可温饱。只是以前工作不用到算法而已。
zhujin
2016-05-10 10:28:35 +08:00
@21grams Duang...理解了.换行符啊...
tvallday
2016-05-10 10:29:40 +08:00
撸两三遍你就知道不是智商问题,而是努力问题。
ren2881971
2016-05-10 10:30:33 +08:00
@ytmsdy 不明白 加上 A[j] = A[i]; 只能将 j 个过滤后的元素 保存到 A[] 中。 但 A[j,,,,n]中的元素还是保持之前的那样啊~
ren2881971
2016-05-10 10:31:02 +08:00
@zhujin 我的失误 sorry
ytmsdy
2016-05-10 10:32:45 +08:00
@ren2881971 那你看他返回的长度,就返回了 j,也就是说到后面数据的解析就就解析到 j 为止。 j 到 n 的数据它才不管呢
hxtheone
2016-05-10 10:42:43 +08:00
这行代码就是为了题干里的"value in place", 要把满足条件的值都移到数组中前 j 个位置上

leetcode 上的题目至少 medium/easy 是相当简单的, 数据结构撑死了就链表二叉树, 算法方面更是 DP 默秒全, 把这些学会我觉得搞定 leetcode 上 2/3 的题完全没问题, 我这样的算法渣都已经撸了快一半的题了, 我工作中也不用都是业余自学, 共勉

顺便求一记 star: https://github.com/MrHuxu/leetcode
guoliang
2016-05-10 10:44:04 +08:00
没关系,慢慢来。我的一点经验:

#1 , 先理解问题,这道题看起来只要 return 一个 int , 可其实 OJ 会根据这个 int 去检查一开始输入的 array 有没有改变。
想几个 input out ,最好包括一些 edge case
#2. 然后再试着画一下数组,不要求写代码的话 你该怎么实现? #如果是面试,这时候就得说出来你的思路来了。
再用前面的 input 代进来,在脑海里或者白板上跑一遍,确定可以拿到 output.
#3. 写代码。
#4. 跑 test case , 想想 time / space complexity ,再比对下别人写的。

如果一时想不出思路,不要着急,再想想,实在不行再看答案,答案看不懂就把 input 放进去在脑海里/白板上跑,一直跑到自己明白每一行的用意。 再开始 #3.

希望对你有帮助。

hackerrank 也不错, test case 更多一些,可以找一些简单练练手感。
ryd994
2016-05-10 10:48:46 +08:00
不过论性能的话我觉得这样不好
既然说了不需要保持顺序
那直接从后面摘元素过来把不需要的覆盖掉就行
减少写入次数
manfay
2016-05-10 10:51:18 +08:00
@ren2881971 这种题先想想如果可以增加一个数组,能怎么写,然后再想怎么“偷工减料”省掉一个数组,这样思考就比较清晰了。

这个题目说要 remove ,但看答案明显没有 remove ,题目表达是有点小问题的,但是算法意图很明显,把想要 remove 的都移到后面去了,真要 remove 也就很简单。

在数据结构上, array 是固定长度(固定内存大小)的,相对于 list , list 是可变长度的。因此,如果要真的删掉一个元素并且真的改变其长度,就只能创建一个新 array 了。这题不让创建新的,结果就只能假 remove (移个位置)。
ren2881971
2016-05-10 10:52:50 +08:00
@hxtheone 嚯~ js 算法 赞
hxtheone
2016-05-10 10:56:35 +08:00
@ren2881971 工作太久都不怎么会 C/C++了 :D
ren2881971
2016-05-10 11:13:29 +08:00
@manfay 懂了。。 假 remove 。 好吧、 了解意图了
youxiachai
2016-05-10 11:20:47 +08:00
大家都不知道毛子的老牌 OJ 平台? http://codeforces.com/
7timesonenight
2016-05-10 11:58:05 +08:00
这玩意,其实没有那么玄乎。掌握了基本的几种算法思想后,熟能生巧,多写代码,注意细节处理。
hitmanx
2016-05-10 12:43:45 +08:00
@manfay “这个题目说要 remove ,但看答案明显没有 remove ,题目表达是有点小问题的”

题目写得很清楚了吧,这是更新后的题目。即使是原题,也写得很清楚。

Given an array and a value, remove all instances of that value *in place* and return the new length.

*Do not allocate extra space for another array, you must do this in place with constant memory. *

The order of elements can be changed. It doesn't matter what you *leave beyond the new length.*
ryd994
2016-05-10 13:02:58 +08:00
@manfay 不懂你想要怎样才叫 remove
用新值覆盖掉,旧的自然不存在了
不是只有删掉格子才叫 remove
数据不存在

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/277511

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX