何同学
11 月 15 号,在 B 站坐拥 1200W 粉丝的著名数码博主「老师好我叫何同学」(以下简称"何同学")发布了视频《我用36万行备忘录做了个动画…》
顾名思义,这就是用手机上的「备忘录」软件,输入 36W 行内容,然后通过滑动内容,来呈现出动画的效果。
大白话就是:电子版翻页动画。
这虽然是一个手机商单视频,但仍然取得了不错的播放数据:5000+ 弹幕、570W+ 播放、全站排行榜最高第 4 名。
36W 行的文本内容,显然不是人工可以做到的。
于是何同学视频也解释到,他们专门写了一个软件来实现该效果。
❝视频中的文案原话:所以我们专门写了一个软件,可以把预览动画里面的色块转换成字符,提高效率,但为了最自然的效果,前面白条,躲避障碍的动画,依然是一行一行画的。最后这个文档有36万。
❞
这个软件,毫无疑问是这个视频里,技术含量最高的内容了。
但很快就被眼利的网友发现,何同学口中这款"专门写的软件"其实是一个在 GitHub 上颇受欢迎的开源项目,而且他还删除了原作者的信息。
甚至何同学连创建一个项目文件夹的步骤都没有,代码都是直接在 "Download" 路径下运行:
该项目名为「ASCII generator」,是一个用于生成 ASCII 码的 Python 项目,支持图像转文本、图像转图像、视频转视频。
得益于这一波"泼天流量",该项目的 star 很快就从 1.8k 飙升到 2.9k。
甚至有网友直接定位到视频展示代码所在的文件:
很快,各种实锤的使得何同学不得不下场回应,在视频的评论区置顶了声明,直言这是文案审稿问题,但网友并不卖账,觉得删除原作者信息的做法显然不是无心之失:
上述评论很快就被删除了。
甚至一些用「原截图和实锤证据」做成视频的网友,都被拉黑了 🤣🤣:
其实相比于这些乐子,我觉得更加离谱的是,网友对项目 issue 的污染:
在这事火了之后,基本上该项目的所有 issue 都是谈及此事的,我觉得大家有话想对何同学说的话,大可使用别的方式,采用污染项目 issue 的做法,实在是有点丢脸到国外的意思。
对此,你怎么看?
...
回归主题。
来一道简单算法题。
题目描述
平台:LeetCode
题号:34
给定一个按照升序排列的整数数组 nums
,和一个目标值 target
。
找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target
,返回 。
示例 1:
输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]
示例 2:
输入:nums = [5,7,7,8,8,10], target = 6
输出:[-1,-1]
示例 3:
输入:nums = [], target = 0
输出:[-1,-1]
提示:
nums
是一个非递减数组
进阶:
你可以设计并实现时间复杂度为 的算法解决此问题吗?
二分
这是一道「二分查找」的裸题。
「二分」有一个比较容易混淆的点是:当需要找目标值第一次出现的下标时,条件应该写成 nums[mid] >= target
还是 nums[mid] <= target
。
其实有一个很好理解的方法:
由于二分是从中间开始找起的,所以找的必然是条件区间中靠近中心的的边界值。
文字不好理解,我们结合图片来看:
Java 代码:
class Solution {
public int[] searchRange(int[] nums, int t) {
int[] ans = new int[]{-1, -1};
int n = nums.length;
if (n == 0) return ans;
int l = 0, r = n - 1;
while (l < r) {
int mid = l + r >> 1;
if (nums[mid] >= t) r = mid;
else l = mid + 1;
}
if (nums[r] != t) return ans;
ans[0] = r;
l = 0; r = n - 1;
while (l < r) {
int mid = l + r + 1 >> 1;
if (nums[mid] <= t) l = mid;
else r = mid - 1;
}
ans[1] = r;
return ans;
}
}
C++ 代码:
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int t) {
vector<int> ans = {-1, -1};
int n = nums.size();
if (n == 0) return ans;
int l = 0, r = n - 1;
while (l < r) {
int mid = l + r >> 1;
if (nums[mid] >= t) r = mid;
else l = mid + 1;
}
if (nums[r] != t) return ans;
ans[0] = r;
l = 0; r = n - 1;
while (l < r) {
int mid = l + r + 1 >> 1;
if (nums[mid] <= t) l = mid;
else r = mid - 1;
}
ans[1] = r;
return ans;
}
};
Python 代码:
class Solution:
def searchRange(self, nums: List[int], t: int) -> List[int]:
ans = [-1, -1]
n = len(nums)
if n == 0: return ans
l, r = 0, n - 1
while l < r:
mid = l + r >> 1
if nums[mid] >= t: r = mid
else: l = mid + 1
if nums[r] != t: return ans
ans[0] = r
l, r = 0, n - 1
while l < r:
mid = l + r + 1 >> 1
if nums[mid] <= t: l = mid
else: r = mid - 1
ans[1] = r
return ans
TypeScript 代码:
function searchRange(nums: number[], t: number): number[] {
const ans= [-1, -1];
const n = nums.length;
if (n == 0) return ans;
let l = 0, r = n - 1;
while (l < r) {
const mid = l + r >> 1;
if (nums[mid] >= t) r = mid;
else l = mid + 1;
}
if (nums[r] !== t) return ans;
ans[0] = r;
l = 0; r = n - 1;
while (l < r) {
const mid = l + r + 1 >> 1;
if (nums[mid] <= t) l = mid;
else r = mid - 1;
}
ans[1] = r;
return ans;
};
时间复杂度: 空间复杂度:
往期推荐
Java多次启动一个线程究竟会发生什么?程序到底会不会崩?大部分程序员理解错误!!
这里有最新前沿技术资讯、技术干货等内容
点这里 ↓↓↓ 记得 关注✔ 标星⭐ 哦