文章列表 - 第6页
所有文章的完整列表,按时间倒序排列 - 第6页
废话不说,进入正题,为了简便请调整项目属性为使用多字节字符集
tinyxml文件下载地址,(操作xml文件的)
http://sourceforge.net/projects/tinyxml/
一些函数功能
ValueStr //返回元素名称
SetValue //设置元素名称
Parent //返回父节点对象
FirstChild //返回第一个子节点
LastChild //返回最后一个子节点
IterateChildren //返回下一个子节点
InsertEndChild //在最后一个子节点后插入子节点
InsertBeforeChild //在指定的子节点前插入子节点
InsertAfterChild //在指定的子节点后插入子节点
ReplaceChild //替换指定的子节点
RemoveChild //删除指定的子节点
Clear //删除所有的子节点
PreviousSibling //返回同级中前一个节点
NextSibling //返回同级中后一个节点
NextSiblingElement //返回同级中后一个元素
FirstChildElement //返回第一个子元素节点
Attribute //返回元素中的属性值
QueryValueAttribute //返回元素中的属性值
SetAttribute //设置元素中的属性值
FirstAttribute //返回元素中第一个属性对象
LastAttribute //返回元素中最后一个属性对象
RemoveAttribute //删除元素中指定的属性对象
tinyxml的添加
首先,将下载的文件解压复制到原项目目录,
然后,在解决方案中头文件添加现有项,添加进去。
接下来,在stdafx.h中包含两个头文件。
mfc中xml文件的使用
第一步:建立对话框,添加CString变量(与编辑框关联起来).
第二步,(信息录入)添加按钮处理消息(双击按钮即可),利用UpdataeData()更新数据,将数据录入xml文件。
TiXmlDocument *pDoc = new TiXmlDocument();//文件指针
const char *FileName = "res\\Number.xml";//文件名
if(!pDoc->LoadFile(FileName))
{
UpdateData(TRUE);
TiXmlElement *RootElement = NULL;//根节点
TiXmlElement *PersonElement = NULL;//子节点
TiXmlDeclaration *pTd = new TiXmlDeclaration("1.0", "gb2312", "yes" );
pDoc->LinkEndChild(pTd);
RootElement = new TiXmlElement("账号数据");
pDoc->LinkEndChild(RootElement);
}
else{
RootElement = pDoc->RootElement();
}
PersonElement = new TiXmlElement("用户");
RootElement->LinkEndChild(PersonElement);
TiXmlElement *NameElement = new TiXmlElement("账号");
PersonElement->LinkEndChild(NameElement);
TiXmlText *Number = new TiXmlText([要存的数据]);//存的数据可为CString类型
NameElement->LinkEndChild(Number);
TiXmlElement *PassWordElement = new TiXmlElement("密码");
PersonElement->LinkEndChild(PassWordElement);
TiXmlText *PassWord = new TiXmlText([要存的数据]);//存的数据可为CString类型
PassWordElement->LinkEndChild(PassWord);
//你有几项就弄几段上面的代码,本例为两项数据
pDoc->SaveFile(FileName);
- 第三步,(信息显示)先添加list control 控件,选择report(报表)属性,同时添加变量m_ctllist1选择control类型(默认)。
然后在OnInitDialog(void)函数中添加如下代码
[Meting]
[Music title=“Hoaprox-Ngau Hung (Remix)” author=“Ms-TearGas” url=“https://blog.cdn.thinkmoon.cn/Ms-TearGas - Hoaprox-Ngau Hung (Remix).mp3” pic=“https://blog.cdn.thinkmoon.cn/blog/typecho/20180328184443532731.jpg” /]
[/Meting]

最近有点丧,我不知道是否有受疫情大环境的影响。总觉得自己干什么都提不起劲来,有的时候非常明确的知道自己该做什么,但就是不愿意去做。就好似,无法避免失败,就为了逃避失败而选择沉沦了。。。我是一个非常骄傲的人,总觉得自己和别人不一样,但也说不出不一样的地方在哪里。亦或许这就是维护我自尊的唯一方式了吧。实话说,就目前来看,从出生到现在,过程并不惊艳,甚至都达不到优秀,勉强算个平淡无奇,未来也无卓越的可能性。也许是心理预期与个人表现不一致的差距,让我几乎每时每刻都承受着内心的谴责。从出生到小学,到中学,再到大学,到现在的毕业工作,似乎表现永远也不能让我及周围的人满意,周围人给我的评价就是各种懒,我自己却感觉深深的力不从心。
很多时候,我会怀疑自我地幻想如果我生下来就是傻傻的该多好,这样我不管做什么,都能让我自己和别人满意。而事实却恰恰相反,家人们认为我很聪明,朋友们觉得我很厉害,我自己也以为我很牛逼。所以每当我看到别人优秀地方的时候,我一定需要给自己一个交代,我会试图找一个自己比TA更优秀的地方,如果这个点与TA的优秀点领域越接近,我心里便会轻松点。如此频繁的选择竞争性对手,让我一直活在谴责与鞭策相互交织的心理世界,这让我非常痛苦。我不知道这样的痛苦,何时会是一个尽头。但随着年龄的增长,这种痛苦越来越严重的侵蚀着我的意志。如同置身狂风骇浪,时刻不能停歇。
或许每个人都这样,出生时感觉自己是世界的主角,到最后慢慢意识到自己是个跑龙套的,高估了自己被世界需要的可能性。好在大部分人拥有一种构建自我世界的能力,在某个学术领域,或是某种知识体系中,亦或许是某个社交圈,都能找到自己归属。我也在一直寻找着自己的归宿,无奈想要的太多,一直未能找到。
我喜欢熬夜,自从高中熬夜看小说之后。白天,每个人都在奋笔疾书,我试图努力却总害怕。万一,我努力了,依旧比不过他们。那么,我又该怎样呢?一次又一次的因为害怕失败而选择沉沦。每当夜深人静,人们都停下脚步进入自己的梦乡之时,我便可以静静的享受夜的温柔,此时的我不用考虑如何竞争去超越别人,做任何事情都不用担心良心的谴责,只需好好享受属于自己的时光,幻想着岁月可期。
我不会喝酒,也不喜欢喝酒,但我羡慕举杯邀明月的洒脱。我能在夜晚做到的最肆意的事,就是坐在电脑荧屏前,带上耳机听着个性电台推荐的DJ,指尖洋溢着代码的芬芳,跟随着音乐的律动,实现着无聊且好玩的想法,肆意妄为地浪费着大好时光,痛快!

解法1:中心拓展算法
思路
首先,我们知道回文串一定是对称的,所以我们可以选择一个对称中心,进行左右扩展,判断左右字符是否相等即可。
由于存在奇数的字符串和偶数的字符串,所以我们需要从一个字符开始扩展,或者从两个字符之间开始扩展,所以总共有 n+n-1 个中心。
实现代码
class Solution:
def longestPalindrome(self, s: str) -> str:
n = len(s)
Max,sub = 0,s[0:1]
for i in range(n):
tmp = self.searchPalindrome(i-1,i+1,s)
if len(tmp) > Max:
Max = len(tmp)
sub = tmp
tmp = self.searchPalindrome(i-1,i,s)
if len(tmp) > Max:
Max = len(tmp)
sub = tmp
return sub
def searchPalindrome(self, left: int, right: int, s: str) -> int:
sub = ""
while left != -1 and right != len(s):
if s[left] == s[right]:
sub = s[left:right+1]
left-=1
right+=1
else : break
return sub
马拉车算法
class Solution:
# Manacher 算法
def longestPalindrome(self, s: str) -> str:
# 特判
if len(s) < 2 or s == s[::-1]:
return s
# 得到预处理字符串
t = "#" + "#".join(s) + "#"
# 新字符串的长度
t_len = len(t)
# 数组 p 记录了扫描过的回文子串的信息
p = [0]*t_len
# 双指针,它们是一一对应的,须同时更新
max_right = 0
center = 0
# 当前遍历的中心最大扩散步数,其值等于原始字符串的最长回文子串的长度
max_len = 1
# 原始字符串的最长回文子串的起始位置,与 max_len 必须同时更新
start = 1
for i in range(t_len):
if i < max_right:
mirror = 2 * center - i
# 这一行代码是 Manacher 算法的关键所在,要结合图形来理解
p[i] = min(max_right - i, p[mirror])
# 下一次尝试扩散的左右起点,能扩散的步数直接加到 p[i] 中
left = i - (1 + p[i])
right = i + (1 + p[i])
# left >= 0 and right < t_len 保证不越界
# t[left] == t[right] 表示可以扩散 1 次
while left >= 0 and right < t_len and t[left] == t[right]:
p[i] += 1
left -= 1
right += 1
# 根据 max_right 的定义,它是遍历过的 i 的 i + p[i] 的最大者
# 如果 max_right 的值越大,进入上面 i < max_right 的判断的可能性就越大,这样就可以重复利用之前判断过的回文信息了
if i + p[i] > max_right:
# max_right 和 center 需要同时更新
max_right = i + p[i]
center = i
if p[i] > max_len:
# 记录最长回文子串的长度和相应它在原始字符串中的起点
max_len = p[i]
start = (i - max_len) // 2
return s[start: start + max_len]
成果


我的初次实现
class Solution:
def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:
newList = nums1 + nums2
newList.sort()
result = 0
if(len(newList)%2 != 0) :
result = newList[math.ceil(len(newList)/2-1)]
else:
index = int(len(newList)/2)
result = (newList[index] + newList[index-1])/2
return result
成果

问题
但是我们仔细观察,可以发现这个的时间复杂度是不够的。

描述
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。
如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。
您可以假设除了数字 0 之外,这两个数都不会以 0 开头。
示例:
输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)
输出:7 -> 0 -> 8
原因:342 + 465 = 807
思路
我看到这个题的第一感觉就是用递归把数获取出来,然后再相加,之后再把得数结构化。问题就被细分为了两个方面:
加数的提取
得数的结构化
我的初次实现
class Solution:
def getStr(self,node: ListNode) -> str:
if node.next == None:
return node.val
else:
last = self.getStr(node.next)
return str(last) + str(node.val)
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
num1 = self.getStr(l1)
num2 = self.getStr(l2)
result = int(num1) + int(num2)
resultList = list(str(result))
tmp = ListNode(int(resultList.pop(0)))
List = tmp
while resultList:
tmp = ListNode(int(resultList.pop(0)))
tmp.next = List
List = tmp
return List
成果


思路
查找无重复的字符子串,然后滑动窗口
初次解
每次滑动一格窗口
class Solution:
def isUnique(self, s: str) -> bool:
for ch in s:
if s.count(ch) > 1:
return False
else:
continue
return True
def lengthOfLongestSubstring(self, s: str) -> int:
i,j,Max=0,0,0
j+=1
while j <= len(s):
if self.isUnique(s[i:j]):
print(s[i:j],"is Unique",i,j)
Max=max(j-i,Max)
j+=1
else:
i+=1
return Max
成果
第一次优化
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
if(len(s)==1):
return 1
i,j,Max=0,0,0
while j <= len(s):
st = s[i:j+1]
if(j+1 < len(s)):
index = st.find(s[j+1])
if index > -1:
i+=(index+1)
j+=1
Max=max(j-i+1,Max)
else:
break
return Max
成果


Description
Given an array of integers, return indices of the two numbers such that they add up to a specific target.
You may assume that each input would have exactly one solution, and you may not use the same element twice.
Example:
Given nums = [2, 7, 11, 15], target = 9,
Because nums[0] + nums[1] = 2 + 7 = 9,
return [0, 1].
0. My solution(Brute Force)
var twoSum = function(nums, target) {
for(let i = 0; i < nums.length; i++) {
for(let j = 0; j < nums.length; j++) {
if(nums[i] + nums[j] === target && i != j) {
return [i, j]
}
}
}
};
· Time complexity: O(n^2), For each element, I try to find its complement by looping through the rest of array which takes O(n)*O(n) time. Therefore, the time complexity is O(n^2).
前言
在上篇文章中,我们已经实现了VS code的无缝连接docker,却依旧存在着一些问题。比如它需要安装pylint方便调试,但是每次stop 容器之后,重新启动又需要重新安装,不可谓不麻烦。而且我发现它也需要重新安装VS code server,这是一个严重影响生产力的过程。所以目前的需求就变了如何作一些自定义的修改,并让这些修改永久性的保存。那答案当然是自定义的构建镜像啦,它可以让我们在构建的实践使用容器的过程中,将所做的更新持续化保存到自定义镜像。
自定义修改
在这里,我手动做了两个修改,一个是安装pylint,一个是更新pip。

提交更改
docker commit -m="install pylint" -a="chauncey" tf chauncey/tf
如上命令,将所有对容器的操作都保存至自定义镜像chauncey/tf 中。
测试效果
- 停止当前容器
docker stop tf
- 使用自定义镜像创建容器
docker run --gpus all -itd --name tf --rm -v ~/Project:/root/Project chauncey/tf
- 使用VS code远程连接,观察pip版本和pylint的安装情况。

如上图,我们发现pip已经是最新的版本。而且细心小伙伴会发现,连接容器时以及没有了install Dev container的提示了,这说明我们的VS code也已经预设安装进了镜像。
