ARTS 006

本贴最后更新于 1868 天前,其中的信息可能已经时移世易

ARTS 是由左耳朵耗子陈皓在极客时间专栏《左耳听风》中发起的一个每周学习打卡计划。

Algorithm:至少做一个 LeetCode 的算法题。主要为了编程训练和学习。

Review :阅读并点评至少一篇英文技术文章。主要为了学习英文,如果你英文不行,很难成为技术高手。

Tip:学习至少一个技术技巧。主要是为了总结和归纳你日常工作中所遇到的知识点。

Share:分享一篇有观点和思考的技术文章。主要为了输出你的影响力,能够输出你的价值观。

Algorithm

搜索旋转序列

搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。

你可以假设数组中不存在重复的元素。

你的算法时间复杂度必须是 O(log n) 级别。

示例 1:

输入: nums = [4,5,6,7,0,1,2], target = 0
输出: 4
示例 2:

输入: nums = [4,5,6,7,0,1,2], target = 3
输出: -1

解法 1

func search(nums []int, target int) int {
    return findNum(nums,0,len(nums)-1,target)
}

func findNum(nums []int, low int, high int, target int) int {

	mid := low + ((high - low) >> 2)
	if low == high {
		if nums[low] == target {
			return low
		} else {
			return -1
		}
	}
	if nums[low] < nums[mid] {
		r := binarySearch(nums, low, mid, target)
		if r == -1 {
			return findNum(nums, mid+1, high, target)
		} else {
			return r
		}
	} else {
		r := binarySearch(nums, mid+1, high, target)
		if r == -1 {
			return findNum(nums, low, mid, target)
		} else {
			return r
		}
	}
	return -1
}

func binarySearch(n []int, low int, high int, target int) int {
	mid := low + ((high - low) >> 2)
	for low <= high {
		if n[mid] > target {
			high = mid - 1
		} else if n[mid] < target {
			low = mid + 1
		} else {
			return mid
		}
	}
	return -1
}

解法 2

func search(nums []int, target int) int {
    n := len(nums)
    l, r := 0, n
    var m int
    for l < r {
        m = l + (r-l) >> 1
        if nums[m] == target {
            return m
        } else if nums[l] == target {
            return l
        } else if nums[r-1] == target {
            return r-1
        }
        if nums[l] < nums[m] {
            if target > nums[m] || nums[l] > target {
                l = m+1
            } else {
                r = m
            }
        } else {
            if nums[m] > target || target > nums[r-1] {
                r = m
            } else {
                l = m+1
            }
        }
    }
    return -1
}

Review

在微服务架构中的服务发现

本篇文章来自于 Nginx 官方博客,这是介绍微服务架构一系列文章中的一篇,本文先由 Resful API、thrift API 的调用,引出服务发现的必要性,在过去我们用一个静态的配置文件保存需要调用服务的地址,在现代微服务架构中其暴露的问题越来越明显,微服务的拆分,意味着更多的服务的实例,随之而来的是服务的管理,包括自动扩容、下线、升级等维护工作。所以我们需要一个动态的发现服务变更的机制,这就是服务发现。服务发现包括 3 种模式。

  • 客户端发现模式
  • 服务端发现模式
  • 第三方注册模式

Tip

Linux 常用命令行快捷键

  • Ctrl + w 删除当前光标之前的字符
  • Ctrl + u 删除当前光标至初始的字符
  • Ctrl + b 向前移动光标 back
  • Ctrl + f 想后移动光标 forward
  • Ctrl + e 移动到行位
  • Ctrl + a 移动到行首

Share

近期工作不是很忙,开发工作出于尾声,也恰好总结一下这段时间的工作。从今年一月份到现在为止一直持续学习,并且新工作中面临的一些挑战,也让我有肉眼可见的成长。在这段时间内,成功的从 PHP 转向 Golang 的开发,让自己的职业生涯柳暗花明,在对接银行支付的项目中对业务的理解更加深刻,并且熟悉了 RabbitMQ 消息队列,开始学习并且在日常开发中使用 vim 开发。自学的有 mysql、消息队列、计算机组成原理、通信协议、架构的基础知识。

同时也为后面的几个月做一个简单的计划和学习方向

  • 持续 ARTS,多总结
  • 学习英语,多阅读英文资料
  • 算法与数据结构
  • linux 性能优化
  • 网路编程
  • 微服务架构和系统设计

相关帖子

回帖

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...