思路:循环中两两交换
手写模拟一下交换的过程就比较容易了
下图是我写的模拟过程:

代码实现:中规中矩地模拟就完事
时间复杂度O(n)
空间复杂度O(1)
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
ListNode* cur =head;
ListNode* per =new ListNode();
ListNode* k = new ListNode();
bool t=false;
while(cur!=nullptr&&cur->next!=nullptr){//有可以进行交换的节点
k=cur->next;//per要指向cur->next,先用k存cur->next
cur->next=k->next;//改变cur的指针域
per->next=k;
per=per->next;
per->next=cur;
if(!t){//注意,当头两个节点进行交换后,head也需要进行交换
head=per;
t=true;
}
per=cur;
cur=cur->next;
}
return head;
}
};
收获摘要:carl哥的方法用了虚拟头节点,我没用虚拟头节点,写下来还比较顺畅,就是要注意返回的head因为交换,要改变。
学习的文章链接:https://programmercarl.com/0024.两两交换链表中的节点.html#_24-两两交换链表中的节点
单链表倒着数真是吃饱没事干,正着数再减一减就可以了
题目链接:https://leetcode.cn/problems/remove-nth-node-from-end-of-list/
思路:先计算链表的总长度
然后算出正着数是第几个
删除节点
代码实现:
时间复杂度O(n)
空间复杂度O(1)
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
int m=1;//计数器
ListNode* phead=new ListNode(0,head);//虚拟头节点
ListNode* cur=phead->next;
while(cur->next!=nullptr){//计算链表长度
cur=cur->next;
m++;
}
m=m-n;//从左至右第m个
cur=phead;
while(m>0){
cur=cur->next;
m--;
}
ListNode* d=cur->next;
cur->next=cur->next->next;
delete d;
return phead->next;
}
};
收获摘要:设置虚拟头节点方便处理针对头节点的情况,
比如删掉头节点后,就不能返回头节点,
但是可以返回虚拟头节点的指针域doge
此题用双指针法可以只扫一遍链表,类似于滑块doge
双指针yyds!精简了计算666
ps:双指针的代码可以在文章链接里参考,就不ctrl+v了哈哈哈
复习的时候可以用双指针实现
学习的文章链接:https://programmercarl.com/0019.删除链表的倒数第N个节点.html#_19-删除链表的倒数第n个节点
就是说收束前两条链表不一样长~
题目链接:https://leetcode.cn/problems/intersection-of-two-linked-lists-lcci/
前提:不存在环
相交点不是数值相等,而是指针(节点)相等
思路:算出两条链表的长度
两条链表相交节点之后的长度相等
进行一个右对齐的操作,然后往后找相交节点
代码实现:
时间复杂度O(n)
空间复杂度O(1)
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
ListNode* curA=new ListNode(0,headA);
ListNode* curB=new ListNode(0,headB);
int la=0;
int lb=0;
int l;
while(curA->next!=NULL){
curA=curA->next;
la++;
}
curA=headA;
while(curB->next!=NULL){
curB=curB->next;
lb++;
}
curB=headB;
l=(la>lb)?la:lb;
for(int i=1;i<=l;i++){
if(curA==curB){
return curA;
}
else if(la>lb){
curA=curA->next;
la--;
}
else if(la<lb){
curB=curB->next;
lb--;
}
else{
curA=curA->next;
curB=curB->next;
}
}
return NULL;
}
};
收获摘要:虚拟头节点方便考虑头节点的情况(梅开n度),
链表长度不一样就把它拉到一样,然后就一路畅通了。
他跑、她走,她被追~此处应有bgm:恋爱循环doge
思路:双指针,一快一慢
每次快指针比慢指针还要快一步 (just one)
快指针先进入循环(循环ing)
直到两个指针相遇(!!)
经过一些数学运算
请返回:循环入口
代码实现:
时间复杂度O(n)
空间复杂度O(1)
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode *detectCycle(ListNode *head) {
int xy=0;
ListNode* fast=head;
ListNode* slow=head;
if(head==NULL)return NULL;
while(fast->next!=NULL&&fast->next->next!=NULL){
fast=fast->next->next;
slow=slow->next;
xy++;
if(slow==fast){//两个指针相遇了
slow=head;//一个退回原点,另一个从相遇节点继续循环
while(slow!=fast){
fast=fast->next;
slow=slow->next;
}
return slow;//再相遇就是循环入口节点
}
}
return NULL;
}
};
收获摘要:双指针yyds(这句话我已经说了千百遍~)
理解 x:头节点-循环入口节点
y:循环入口节点-相遇节点
z:相遇节点-循环入口节点
双指针走过的路程以及这三个数之间的关系
还有一点需要注意的是:
当头节点为NULL时,它肯定不能循环,甚至不是个链表,直接返回NULL即可。
学习时长:5h
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html
我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的
在Ruby中是否有Gem或安全删除文件的方法?我想避免系统上可能不存在的外部程序。“安全删除”指的是覆盖文件内容。 最佳答案 如果您使用的是*nix,一个很好的方法是使用exec/open3/open4调用shred:`shred-fxuz#{filename}`http://www.gnu.org/s/coreutils/manual/html_node/shred-invocation.html检查这个类似的帖子:Writingafileshredderinpythonorruby?
我正在尝试找到一种方法来规范化字符串以将其作为文件名传递。到目前为止我有这个:my_string.mb_chars.normalize(:kd).gsub(/[^\x00-\x7F]/n,'').downcase.gsub(/[^a-z]/,'_')但第一个问题:-字符。我猜这个方法还有更多问题。我不控制名称,名称字符串可以有重音符、空格和特殊字符。我想删除所有这些,用相应的字母('é'=>'e')替换重音符号,并将其余的替换为'_'字符。名字是这样的:“Prélèvements-常规”“健康证”...我希望它们像一个没有空格/特殊字符的文件名:“prelevements_routin
目录一.加解密算法数字签名对称加密DES(DataEncryptionStandard)3DES(TripleDES)AES(AdvancedEncryptionStandard)RSA加密法DSA(DigitalSignatureAlgorithm)ECC(EllipticCurvesCryptography)非对称加密签名与加密过程非对称加密的应用对称加密与非对称加密的结合二.数字证书图解一.加解密算法加密简单而言就是通过一种算法将明文信息转换成密文信息,信息的的接收方能够通过密钥对密文信息进行解密获得明文信息的过程。根据加解密的密钥是否相同,算法可以分为对称加密、非对称加密、对称加密和非
我去了这个website查看Rails5.0.0和Rails5.1.1之间的区别为什么5.1.1不再包含:config/initializers/session_store.rb?谢谢 最佳答案 这是删除它的提交:Setupdefaultsessionstoreinternally,nolongerthroughanapplicationinitializer总而言之,新应用没有该初始化器,session存储默认设置为cookie存储。即与在该初始值设定项的生成版本中指定的值相同。 关于
啊,正则表达式有点困惑。我正在尝试删除字符串末尾所有可能的标点符号:ifstr[str.length-1]=='?'||str[str.length-1]=='.'||str[str.length-1]=='!'orstr[str.length-1]==','||str[str.length-1]==';'str.chomp!end我相信有更好的方法来做到这一点。有什么指点吗? 最佳答案 str.sub!(/[?.!,;]?$/,'')[?.!,;]-字符类。匹配这5个字符中的任何一个(注意,。在字符类中并不特殊)?-前一个字符或组
你好,我无法成功如何在散列中删除key后释放内存。当我从哈希中删除键时,内存不会释放,也不会在手动调用GC.start后释放。当从Hash中删除键并且这些对象在某处泄漏时,这是预期的行为还是GC不释放内存?如何在Ruby中删除Hash中的键并在内存中取消分配它?例子:irb(main):001:0>`ps-orss=-p#{Process.pid}`.to_i=>4748irb(main):002:0>a={}=>{}irb(main):003:0>1000000.times{|i|a[i]="test#{i}"}=>1000000irb(main):004:0>`ps-orss=-p
假设我有一段Ruby代码,我想在其中为一个方法设置别名(我不知道为什么;让我们假设我有一个很好的理由)。classStringalias_method:contains?,:include?end我可以在本节之后删除这个别名吗? 最佳答案 remove_method在大多数情况下应该有效。但是,如果您的alias_method覆盖了现有方法,您可能需要通过单独的alias_method调用来保存原始方法。#assuming:contains?isalreadyamethodalias_method:original_contains