不是那种看别人现成的代码理解之后写出来,而是完全没听过,只给需求就能慢慢写出来这种。自己想达到的水平如下面贴出的。而自己现在处于:按自己思路写出的漏洞百出,改好这个 bug,又出新 bug 的水平。别说优雅了,下面这种难度的算法,完全给自己实现,都不能正确搞出来。。。
/**
* 二分查找法变种 floor, 在有序数组 arr 中, 查找 target
* 如果找到 target, 返回第一个 target 相应的索引 index
* 如果没有找到 target, 返回比 target 小的最大值相应的索引, 如果这个最大值有多个, 返回最大索引
* 如果这个 target 比整个数组的最小元素值还要小, 则不存在这个 target 的 floor 值, 返回-1
*
* @param arr
* @param target
* @return
*/
static int floor(Comparable[] arr, Comparable target) {
// 寻找比 target 小的最大索引
int l = -1, r = arr.length - 1;
while (l < r) {
// 使用向上取整避免死循环
int mid = l + (r - l + 1) / 2;
if (arr[mid].compareTo(target) >= 0) {
r = mid - 1;
} else {
l = mid;
}
}
assert l == r;
// 如果该索引+1 就是 target 本身, 该索引+1 即为返回值
if (l + 1 < arr.length && arr[l + 1] == target) {
return l + 1;
}
// 否则序列中无 target, 该索引即为返回值
return l;
}
1
TomVista 2018-12-28 11:53:17 +08:00
打好基础,这个就不算算法. 虽然他是,但是你总不能把类似于冒泡排序这种东西称之为算法吧.
还有算法这东西一般大家都用现成的:dog |
2
visitant 2018-12-28 12:00:25 +08:00 via iPhone
说完全没听过我是不信,二分查找都没听过,逗我玩吗
|
3
subpo 2018-12-28 12:29:41 +08:00
这代码优雅在哪儿...
|
4
Raisu 2018-12-28 12:54:04 +08:00
买一本 数据结构与算法 入门教材,把里面的数据结构都自己实现一遍,了解每种数据结构基本操作的复杂度,刷 LeetCode 的 easy。
买深入一点的 算法教材, 把里面几个基础的算法思路都了解一遍。再刷一遍 LeetCode。 |
5
sylxjtu 2018-12-28 12:57:24 +08:00 via Android
二分算法边界情况很多,初学者背下来是最方便的
|
6
Caturra 2018-12-28 13:12:37 +08:00
完全没听过说明你基础不行
建议买本通俗易懂的算法书花两三天粗略扫一遍然后找 OJ 刷题 |
7
hexingb 2018-12-28 13:14:12 +08:00
其实你面对的是两个问题:一是对算法的理解;而是开发能力。如果你 i 理解二分法,能写出上面变种算法的大体结构却漏洞百出,说明你其实开发能力欠缺。
提升方法么,无非多读书、多思考、多实践。 |
8
tt67wq 2018-12-28 13:15:36 +08:00
欧拉计划刷到 100+ 算法就算入门了
|
11
Yiki 2018-12-28 13:51:16 +08:00
盲目追求优雅不好吧..
|
17
visitant 2018-12-28 16:23:02 +08:00 via iPhone
就像楼上说的,先了解基础算法吧,基础算法实现一遍了解一下思想就差不多了,那些复杂的算法我每次看都会感概人和人之间差距真大
|
18
Yiki 2018-12-28 16:44:47 +08:00
想不到楼主对[优雅]意见这么大……
我的话就是大三学 C 版数据结构,大四看了 Java 算法把代码都弄懂到红黑树那一块了 然后……我就当了前端狗- -~ |
19
maplelin 2018-12-28 17:24:55 +08:00
不知道楼主是怎么定义代码好坏的。写代码的时候遵循一定原则,一般都是在保证功能足够简洁代码尽量抽象的前提下,保证逻辑和调理清晰,然后能够针对意外情况和一些异常做出处理。这个还是经验和素养的问题。
|
20
NotreDame OP @Yiki 不是我意见大,是感觉大家有点跑题,我解释一下而已。。。说实话,我看不出什么特别优雅不优雅的,只是感觉有的代码很干净,不拖拉。
|
23
vex2pp 2018-12-29 11:05:46 +08:00
找几本算法相关的书,比如《编程之美》、《编程珠玑》等,反复看熟练。然后去刷 LeetCode 等平台,反复刷几遍,你就可以成为老司机了。
|