大家好,我是苍何。
B 站知名 up 主何同学近日发布了一个视频《我用 36 万行备忘录做了个动画…》,视频很火,但是更火的是其被指盗用开源项目,却声称「我们专门写了一个软件」,着实讽刺。
视频里展示的这个东西就是个电子翻页动画,具有相当吸引人的元素,不得不说,何同学视频选题总是能 get 到观众兴趣点。
本来是个爆款视频,这也没什么大不了,毕竟坐拥 1200W 粉丝,但问题就在于视频中有这段话:
所以我们专门写了一个软件,可以把预览动画里面的色块转换成字符,提高效率,但为了最自然的效果,前面白条,躲避障碍的动画,依然是一行一行画的。最后这个文档有36万。
然后评论区不知道哪个大神,看出了破绽,好家伙,这不是我在 GitHub 上看到的开源项目 ASCII generator 吗?
这是一个用于生成 ASCII 码的 Python 项目,支持图像转文本、图像转图像、视频转视频。截止目前已经有 3.7 k 的 star 了。
而网友发现何同学视频中的成品效果正是基于该开源项目实现:
这个项目基于的是最为宽松的 MIT 开源协议,虽然以简单和宽松的条款而著称,但尊重作者是最起码的道德底线,柯匡是坐拥 1200 W 粉丝的大 V,更加需要对此事负责。
更讽刺的是,不少人又去 issue 里面提自己的想法,我们知道,GitHub 是个全球的开源平台,这事本就挺丢脸的,还污染了 issue。有人说,丢脸丢到了国外。
借用网友的评论表达下自己的观点:
我觉得不必要开这么多 Issues 去污染这个项目,后面来的人不要再起新 Issue 了,真想讨论直接在一个 Issue 里发表下自己想法就好了。
开源软件使用没问题,但在公开场合是是自己开发的,就有些过分。虽然从现实考虑,可能何同学压根都没参与到代码。
可能给收下的小伙伴个需求,小伙直接找了个开源项目完美实现,你不问,我也不说,那就默认是自己实现了。
结果,视频发布,估计内部审核也不会给到写代码的程序员做审核,然后就发布出去了,要不是被挖出来,估计何同学怎么也想不到。
不过,截止目前,何同学已经做了澄清说明。
我们看到了大家在评论中关于字符画转制程序的讨论。我们视频中使用的字符转制程序确实是由开源项目ASCII-generator改动而来,改动的内容主要是优化字符生成比例、图片裁切方式和传参方式。视频中55秒的旁白“所以我们专门写了一个软件,可以把预览动画里的色块转换成字符”确实不严谨,非常抱歉在视频里没有指出这一点。之所以会出现这种情况,是因为我在写视频的文案时不够严谨,没有和相关同事做好沟通,并没有意识到这个程序是从开源程序改动而来,也没有尽到审稿义务,实在抱歉。我们已经对视频进行换源,修改了相关描述并增加引用来源,同时进行内部检讨,反思流程和审稿上的问题。衷心感谢大家的监督。
但是网友买不买单,就不得而知了。
我看过何同学几期的视频,说不上喜欢,也说不上讨厌,但确实作为科技博主,能科普一些知识,总归是不错的。
但这件事之后,估计何同学对视频审核会更加严格,至少你得给开发代码的程序员看看吧。🐶
不过这波,何同学亏不亏还不好说,借用网友的一句神评论:
毕竟人家本来是想装个 b,露个脸,结果不小心露个 p 股,虽然被喷,但是拿到了流量还有广告费全,大家继续喷,流量又来了。
话说,我要不要也开个账号,叫:我叫苍何同学?😂
对此,你怎么看?欢迎评论区讨论。
...
回归主题。
今天来一道简单面试算法题,给枯燥的牛马生活加加油😂。
题目描述
平台:LeetCode
题号:67
题目名称:二进制求和
题目描述:
给你两个二进制字符串 a
和 b
,以二进制字符串的形式返回它们的和。
示例:
示例 1:
输入:
a = "11", b = "1"
输出:
"100"
示例 2:
输入:
a = "1010", b = "1011"
输出:
"10101"
提示:
1 <= a.length, b.length <= 10^4
a
和b
仅由字符'0'
或'1'
组成。字符串如果不是
"0"
,就不会含前导零。
解题思路
为了实现两个二进制字符串的求和,我们可以模拟人工加法的过程,从最低位到最高位逐位计算,并处理进位。具体步骤如下:
初始化变量:
使用一个变量
carry
保存进位值,初始为 0。使用一个字符串列表
result
保存每一位的计算结果。
逐位计算:
从
a
和b
的最低位(即字符串的末尾)开始逐位相加。对应位置的数字与进位
carry
相加,得到当前位的和。将该和取模 2 的结果加入
result
,并更新进位carry = 和 // 2
。
处理未完的进位:
如果加完所有位后,
carry
仍然为 1,则需在结果前加上1
。
返回结果:
将结果列表
result
逆序并拼接成字符串。
时间复杂度:
O (n),其中 n 为较长的字符串长度,因为需要遍历字符串中的每一位。
空间复杂度:
O (n),用于存储结果字符串。
代码实现
Java 代码
public class BinarySum {
public String addBinary(String a, String b) {
StringBuilder result = new StringBuilder();
int i = a.length() - 1, j = b.length() - 1, carry = 0;
// 从最低位开始逐位相加
while (i >= 0 || j >= 0 || carry != 0) {
int digitA = (i >= 0) ? a.charAt(i--) - '0' : 0;
int digitB = (j >= 0) ? b.charAt(j--) - '0' : 0;
// 当前位的和
int sum = digitA + digitB + carry;
result.append(sum % 2); // 取模 2 得到当前位的值
carry = sum / 2; // 更新进位
}
return result.reverse().toString(); // 结果需要反转
}
}
C++代码
#include <string>
#include <algorithm>
class Solution {
public:
std::string addBinary(std::string a, std::string b) {
std::string result;
int i = a.length() - 1, j = b.length() - 1, carry = 0;
// 从最低位开始逐位相加
while (i >= 0 || j >= 0 || carry != 0) {
int digitA = (i >= 0) ? a[i--] - '0' : 0;
int digitB = (j >= 0) ? b[j--] - '0' : 0;
// 当前位的和
int sum = digitA + digitB + carry;
result.push_back((sum % 2) + '0'); // 取模 2 得到当前位
carry = sum / 2; // 更新进位
}
std::reverse(result.begin(), result.end()); // 结果需要反转
return result;
}
};
Python 代码
class Solution:
def addBinary(self, a: str, b: str) -> str:
result = []
carry = 0
i, j = len(a) - 1, len(b) - 1
# 从最低位开始逐位相加
while i >= 0 or j >= 0 or carry != 0:
digitA = int(a[i]) if i >= 0 else 0
digitB = int(b[j]) if j >= 0 else 0
i, j = i - 1, j - 1
# 当前位的和
total = digitA + digitB + carry
result.append(str(total % 2)) # 取模 2 得到当前位
carry = total // 2 # 更新进位
# 拼接结果并反转
return ''.join(result[::-1])
测试用例
输入:
a = "1010"
b = "1011"
输出:
"10101"
ending
你好呀,我是苍何。是一个每天都在给自家仙人掌讲哲学的执着青年,我活在世上,无非想要明白些道理,遇见些有趣的事。倘能如我所愿,我的一生就算成功。共勉 💪
点击关注下方账号,你将感受到一个朋克的灵魂,且每篇文章都有惊喜。
感谢大家一直以来的阅读、在看和转发,我会把流量主收益都用来发红包,大家可在公众号页面发送相关暗号关键词获取抽奖,每一篇文章会给到一个不同的暗号,对应的抽奖都是独立的,此篇暗号为【何同学】,在后台回复【何同学】,即可点击进去参与抽奖!抽奖内容、金额、个数等都无变化,在开奖前参与抽奖,操作均有效。
注意,后台(不是评论区,是后台)回复【何同学】即可参与抽奖。
后台回复(不是评论区,是后台)即可参与抽奖。
后台回复(不是评论区,是后台)即可参与抽奖。
就像大家之前回复【八股】一样。