前言:什么是ARTS打卡?
ARTS打卡是陈皓(网名左耳朵耗子)于2019年在专栏读者发起的打卡挑战,累计吸引4000+人参与,产出了很多优质的内容。2023年8月15日打卡重启,目的是为了聚集一波热爱技术的人,延续好奇、探索、实践、分享的精神。
Algorithm:一道算法题
题目链接:Problem - 1426
描述:BFS求解算式值
解答:根据题目可以得出求解此问题的最佳方法是队列实现BFS。
解决本题的方法是BFS,其中BFS求解分为BFS朴素求解和BFS同余模定理求解。
以下思路均来自CSDN博客小優YoU大神的解答:POJ1426-Find The Multiple
首先是朴素求解,思路是BFS扫描当前位数字,直到求解。
public class Practice1426Simple1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
BigInteger bigN = BigInteger.valueOf(n);
BigInteger number = BigInteger.valueOf(n+1); // Start with n in binary
while (true) {
if (number.mod(bigN).equals(BigInteger.ZERO)) {
String numStr = number.toString();
int count = numStr.length();
for (char c : numStr.toCharArray()) {
if (c == '0' || c == '1') {
count--;
}
if (count < 1) {
System.out.println(number);
return;
}
}
}
number = number.add(BigInteger.ONE);
}
}
}
然后在做朴素求解的过程中,会发现求解到后期时会产生大数问题(即数字超过了int类型的上限)导致程序意外终止,所以这时候有了新的办法,即数论中的同余模定理。
先来放出同余模定理的公式:
同余模定理涉及到一些数学知识,这里放上知乎-红烧鱼大神的学习笔记:初等数论及其应用-笔记【4】:同余,方便理解。
所以这里的数字求解,就等价为数字的余数求解的问题,优化了计算的方法与速度。
此处放上代码:
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class Practice1426 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
// BFS Queue: store the current binary number as a string and its remainder when divided by n
Queue<String[]> queue = new LinkedList<>();
// Start with "1" (since the highest bit cannot be 0)
queue.add(new String[]{"1", "1"});
// BFS search
while (!queue.isEmpty()) {
String[] current = queue.poll();// 获取并移除队列头部的元素
String binary = current[0];
String remainderStr = current[1];
int remainder = Integer.parseInt(remainderStr);
// Check if the current binary number is a multiple of n
if (remainder == 0) {
System.out.println(binary);
return;
}
// Append "0" and "1" to the current binary number and compute new remainders
queue.add(new String[]{binary + "0", String.valueOf((remainder * 10) % n)});
queue.add(new String[]{binary + "1", String.valueOf((remainder * 10 + 1) % n)});
}
// In case no multiple is found (should not happen for the given problem constraints)
System.out.println("No multiple found");
}
}
最后我在搜索答案与资料时发现BFS大多由队列数据结构实现,这不免引起了我的疑问。在一番搜索与请教大牛同事后我终于理解了,BFS是一种扩散式搜索,是一层一层的搜索,而队列“FIFO”的特性可以让BFS只专注于搜索到的那一层。最后放上一张滴水的图片方便理解。
搜索结果的观点引用自知乎的这篇帖子:BFS算法之所以用到队列的原因
Review:阅读一篇英文文章
分享一篇英文文章,是在扇贝阅读打卡的。
原文链接:https://web.shanbay.com/reading/web-news/articles/bbiusx
Tips:分享一个小技术
这次放上我阅读《重构》书籍时对于重构原则的总结。
Share:表达一个观点:
#读书打卡/2024年/9月
阅读书籍&进度:《中国政治的细节-一个县的减贫治理》40/271
阅读感悟:
截取书中原文:“我们可以把列夫托尔斯泰的名言变一下:贫困的地区都是相似的,富裕的地区各有各的幸运。”
感悟:这句话的意思出自《安娜卡列尼娜》的开篇一句话:“幸福的人都是相似的,不幸的人各有各的不幸。”。我思考后确实是这样,对于成年人的幸福,无非是“有事做、有钱花、有人懂”,但是贫困的人因为各种不同的原因,走到了某种窘境;对于社会来说,贫困都是自然环境、政治因素、社会文化的结果,富裕是因为各个地区有各种不同资源条件,制度的优势。
截取书中原文:“ 大规模暴力冲突对经济发展造成根本性的损害。非洲和亚洲最贫穷的国家大多数都经历过长期内战、种族冲突和恐怖主义暴行。”
感悟:首先我意识到祖国的繁荣稳定,是决定中国几十年走完了西方几百年的工业化发展历程的一个关键因素。反观叙利亚、伊拉克和乌克兰,长期的战乱、种族冲突和恐怖主义暴行使得这些国家的经济发展严重滞后。我应该庆幸自己生于种花家,并做好普通的一员。
读后感悟:
想到和做到是两件不同的事。一个地区的减贫治理,很容易就能想到需要做的方向,但实际做起来需要克服重重困难,做好每一件小事。
改变人的认知,是解决脱贫问题的“内服药方”。有一句话说得好,人永远也赚不到认知之外的钱。人的思想和习惯不改变,脱贫时新建的房屋和拥有马路的村庄,会重新堆满垃圾、杂物和动物的粪便。赌博、毒品、类似毒品一样难以摆脱的文化陋俗,还有落后的卫生习惯导致的传染疾病,会让住在崭新房屋里的人一夜回到脱贫前。
我觉得人的认知改变的途径有阅历、读书和原生家庭。作为普通人既然不能快速拥有各种阅历,那么就可以在后天通过大量阅读提供认知。虽然现在社会的阶层固化在逐渐形成,但对于不愁吃穿的我们,读书是一生都最值得去做的事情。
如果要让公司的管理制度有效落实,那么强硬约束和个人利益相关性是最关键的两个因素。