打开ObeoDesigner的时候跳出了一个弹窗,在网上搜索发现解决方案都与Java编辑器Eclipse有关。仔细看发现文件夹下确实有Eclipse,应该是需要Java和Eclipse支持。

参考了这篇文章,x86是32位的软件,实际上jvm.dll是存在的,但是版本不匹配,于是重新安装一个64位的版本。并修改了环境变量。修改之后检查了一下vscode的java环境,没有问题。

修改环境变量麻烦的就在于担心其他环境不适配。如果能用服务器或者虚拟机做隔离就更好了。

Read more »

vscode看java api的源码非常舒适 提供了跳转到指定源码的功能

结合Oracle的JAVA文档食用更佳

Java相关api介绍网站推荐: Baeldung

CountDownLatch

核心是sync,Sync类是基于AbstractQueueSynchonizer这一抽象接口实现的

AbstractQueueSynchronizer

一个用链表实现的队列,对节点加自旋锁来实现synchronize。按照队列的性质,头部的节点会先获得申请锁的机会,但是不保证成功。

有state来存储状态,其中state是volatile的,即存储在内存中,立即更新,不存在写缓冲问题。

这里的加锁方式有exclusive/shared两种。实现上没有做显著区分

Sync

实现了上述接口,其中Count直接存储在了AbstractQueueSynchronizer(以下简称AQS)的state变量中。

CountDownLatch的countDown方法是调用sync的releaseShared方法实现的 而sync中又调用AQS的tryReleaseShared() 判断能否释放,如果能,就调用doReleaseShared()对队列里的节点做操作。具体会调整列表中节点的状态。

Read more »

原题:

Cache_3de56e540c5c45f2.

参考的是Program Challenge的CSDN解析

数据结构上的绝妙是利用bitset来压缩信息的存储.可以认为把二位vector中的行变为bitset,即每个单位由int变为bit,则每一行对应一个点的连通信息,每个比特对应点对点是否连通。之后的DFS中,通过位运算可以简洁的合并信息并进行判断。

1
2
3
4
set(i); //把bitset的第i位比特设置成1
test(i);//检查bitset的第i位是1则返回true
count();//数bitset中有多少位是1
对bitset可以做位运算

这是一个NPC问题,多项式时间内没有解法,但是可以多项式时间验证解是否正确。作为一个图论问题,自然想到用DFS或者BFS来做。为了求出最小的站点数,从小到大遍历答案并检查。

这里为了简化求解,把图拆封成连通分量分别求解,每个连通分量上的最小解的和就是整个图的最小解。在压入每一个点的信息(即每一行bitset)的时候,可以认为对子图进行了重新编号。

还有一处简化是是通过覆盖率来剪枝。由于遍历是按照序号从小到大来遍历的,back的意思是,从当前点往更大的点遍历,能有多少个点被服务站覆盖。因此填写信息的时候是从序号大的点往序号小的点遍历,因为较大序号的点不会再去遍历小序号的点。这里主要是为了剪枝以下情况。(左侧是结果树)

A45CFDC5EF4DCAB9BA01E313BD59C701

可以看到在对1的处理中,对5做DFS是没有意义的,因此剪枝。

Read more »

这个错误同时在PicGo上传图片和我登陆科学上网小工具的时候出现。一开始在科学上网工具出现的时候没当回事,以为是工具本身问题,再次出现发现不对劲,应该配置问题。

感谢谷歌,让我翻到一个参考解决方案

因为不是PicGo本身的问题,所以搜索到的调整PicGo的方案都不符合我的要求,最后发现是当前用户的系统变量莫名其妙多出来一个https的环境变量,删除以后解决。

Read more »

101. Symmetric Tree

从树的递归性质入手 这里增加的难度在于左右交替判断 注意指针为空的情况

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution {
public:
bool isSym(TreeNode* rt1,TreeNode*rt2)
{
if(!rt1&&!rt2)
return true;
else if(rt1 && rt2)
{
if(rt1->val!=rt2->val)
return false;
return isSym(rt1->left,rt2->right) && isSym(rt1->right,rt2->left);
}
else
return false;
}
bool isSymmetric(TreeNode* root) {
return isSym(root->left,root->right);
}
};

98. Validate Binary Search Tree

搜索树的定义!!复习非递归实现前序遍历

递归:结合范围 注意数字取值的范围

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public:
bool check(long long lower,long long upper, TreeNode* root)
{
if(!root)
return true;
if(root->val <= lower || root->val >= upper)
return false;
return check(lower,root->val,root->left) &&
check(root->val,upper,root->right);
}
bool isValidBST(TreeNode* root) {
return check(LONG_MIN,LONG_MAX,root);
}
};

非递归的中序遍历

甚至都不需要存队列 只需要保存队列的最后一个值进行比较就可以了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
public:
bool isValidBST(TreeNode* root) {
stack<TreeNode*> stk;
long long inorder = LONG_MIN;
while(!stk.empty() || root)
{
while(root)
{
stk.push(root);
root=root->left;
}
root = stk.top();
stk.pop();
if(inorder>=root->val)
return false;
inorder = root->val;
root=root->right;
}
return true;
}
};
Read more »

Longest ZigZag Path in a Binary Tree

尾递归的构建方式 在参数当中完成运算。

本题最优解不依赖于子问题的解,因为有可能子问题中出现最大解但是对于父问题来说不符合加1的要求,例如最长Z路径出现在中间段,所以采用外部设置全局变量比较更新的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Solution {
public:
int maxlen=0;
void tail_recusion(int len,int direct,TreeNode* root)
{
maxlen = max(maxlen,len);
if(root)
{
if(direct==1)//上一次走的是右侧 即当前节点是父节点的右子树
{
if(root->left)
tail_recusion(len+1,0,root->left);
if(root->right)
tail_recusion(1,1,root->right);
}
else//当前节点是父节点的左子树
{
if(root->left)
tail_recusion(1,0,root->left);//1 是为了在下一层中记录本层的位置
if(root->right)
tail_recusion(len+1,1,root->right);
}
}

}
int longestZigZag(TreeNode* root) {
tail_recusion(0,0,root);
tail_recusion(0,1,root);
return maxlen;
}
};

887. Super Egg Drop

重点:描述出状态 找到状态转移方程 本题特征: 利用函数的单调性来逼近答案(这是本题规划的部分)

image-20210526153430141

image-20210526153443782

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class Solution {
public:
map<int,int> memo;//dp中用于存储的字典
int dp(int k,int n)
{
if(memo.find(100*n+k)==memo.end())//找不到
{
int ans = 0;
if(k==1)
ans=n;
else if(n==0)
ans=0;
else
{
int low =1;
int high=n;
while(low+1<high)//是离散的点 所以只能用间隔逼近
{
int x = low + (high-low)/2;
int t1 = dp(k,n-x);
int t2 = dp(k-1,x-1);
if(t1>t2)
low = x;
else if(t1<t2)
high=x;
else
low = high = x;
}
ans=1+min(max(dp(k,n-low),dp(k-1,low-1)),max(dp(k,n-high),dp(k-1,high-1)));
}
memo[100*n+k]=ans;
}
return memo[100*n+k];//利用一个函数映射 把二维降为一维存储
}
int superEggDrop(int K, int N) {
return dp(K,N);
}
};

20220118 树状分析改为动态规划:二分法想到的是对的 最后本质采用了二分查找;压缩的本质是 m~n可以用n-m来表示

Read more »

plantuml

一个绘制类图,时序图的在线网站,支持生成在线的url,无需登录。

和其他工具不太一样的是,输入主要依靠代码描述,和拖拽相比感觉很酷(x

asciinema

终端录制工具,可以把终端的动画保存在网站云端,可以获取url插入markdown,但是大小有限制,超过5M左右就无法顺利上传。邮箱可以直接注册登陆。

可以在命令行安装,但是不支持windows,macOS和linux都可以。

PicGo

一个图床工具,支持github,gitee,七牛腾讯等等云床,可以内嵌进入markdown。

localtunnel

在自己本地测试服务器的时候,如果需要外部网络访问被测试的网站和服务器,可以用这个工具生成网址。

Read more »

原本是在windows上git clone的github仓库,在原仓库有一次较大改动(发布新作业)之后,因为环境问题需要换到linux虚拟机上做,于是需要把仓库也clone到虚拟机上,但是直接git clone我fork过后的仓库只能下载提交后原仓库更新前的代码,需要更新。

首先检查upstream是否有对应的远程仓库

1
git remote -v

如果只有两行origin,说明新设备上的仓库还没有与原本的仓库挂钩,需要添加

1
git remote add remote-original.git

之后再次检查upstream,出现upstream两行就可以了

记得根据upstream的提示切换分支

1
git checkout upstream/main

否则就会依旧停留在旧的版本(在这里卡了很久以为弄错了)

Read more »

rm生日的时候看到一条生贺视频 缪斯、月亮与鲸鱼 里面南俊说 在工作压力下 通过看展 散步 骑车 亲近自然 来放松自己 虽然说不能指望这些体验对音乐工作有直接的作用 但是至少这是他对抗压力的方式

突然鼻子就一酸 南俊的生活当中镶嵌了许许多多他喜欢的治愈的事情 而我却有很长一段时间都在把想做的事情推到“等到xx的时候” 如果压力一直长存没有尽头 如果人生不是为了一个目的就可以放弃一切 那在松动下来的时间里忙里偷闲又有何妨?跑弹不必留到周末再看 吃饭间隙就可以享受 想读的时候就找来放在手边 网络一关就可以开始看 毕竟 某种程度上 这也是让我不必崩溃的办法

到底是为什么没有办法享受闲暇 只能在碎片化中找到安心的时刻 只能在压力下承认自己也需要休息 为什么总要在极端反复跳跃?我想这个问题 得要回到高三的时候 毕竟那个时候只有一个目标 哪怕心底里在反抗 但只能在指挥棒下不断的自我拉扯 看综艺没办法看完 看书也不能认真享受 一切都推到高考以后 推着推着 高考过去了整整两年 我还困在这里

想起来看到的一篇衡水学生的文章 不得不承认尽管自己的高中已经宽松太多 但是总有一些相似的ptsd是高考体制下人们共通的 里面作者写到无法忍受等待和闲暇 做什么都要有目的和效率 实在是让人狠狠共情 为了一个目标能够放弃一切的想法 以及随之造就的习惯 其实作为一种惯性留在很多人的后高考时代 看转发评论里的人们可见一斑 可是有很多事情 也同样重要 或者换句话说 一些斗争不会到此为止 难道要一直这样等到克服一切困难才能放过自己吗 那可能要把一些原本属于自己的时光带进坟墓了

看着南俊 突然意识到自己也有和压力共存的方式 心安理得的在午饭的时候享受跑弹 心安理得的在认真做了几个小时的任务之后放松自己 反倒减少了很多犹如溺水之人抓不到救命稻草的时刻 想要从网络上找一些转移注意力的刺激的时刻减少了不少 搭配digital balance 这两天连睡眠作息都规律了很多

承认自己的压力 承认自己的欲望 让自己慢慢学会享受闲暇 享受专注 避免碎片化的emo 这是我最近学到的love myself的方式 感谢南俊 还有那个剪出让人落泪的生贺视频的4粉

Read more »

配环境有感
配环境是接触一门新语言/一个新框架的启蒙老师!

连续配了Android开发和php网页段的环境。发现为了跑demo实际上掌握了关于一个新技术大致的运行方式。比如Android需要Java底层的支持和很多在线组建的支持 还有php需要配合服务器而不仅仅是一个网页文件

在配环境的过程中 经常会出现按照教程走了却没有得到想要的结果的情况 在解决这种不一致的过程中 必须要去了解原因 也因此会学习关于这门语言或者技术框架的运行原理 这样遇到问题才能分析出原因 配环境的这几个小时不算白搭

另外 在没有现成demo教程的情况下 学会问问题而不仅仅是一遍遍机械重复的尝试变得非常关键 比如我在配php环境的时候一直跑不出更加复杂的他人的项目demo 搜索了如何在浏览器显示php才发现是我想的太简单了 同时也意识到这一套体系是用来模拟网站而不仅仅是网页运行的 解决这一点之后demo丝滑运行了

不过必要的时候还是要寻求帮助 不过要在尝试所以能尝试的 能提问搜索的之后

还有不得不说 Google永远的神 拥有谷歌的人解决问题的概率比没有的人高了不知多少 stackoverfkow也是好东西 看多了加上逼不得已 英文就不再成为阻碍了 而且也能锻炼快速抓重点的能力

Read more »