oj和leetcode区别_【LeetCode OJ】19和20

1.【Remove Nth Node From End of List】(Easy)

移走链表倒数第n个节点并返回表头,如

1->2->3->4->5,n

=

2,返回1->2->3->5

解题思路:一个指针指向表头,一个指针p遍历链表直到null,一个指针q与p距离n一起遍历,这样p到头的时候,q指向倒数第n个节点的前一个节点,如果是移除头结点则直接返回头结点的下一个节点。

Accept代码:

public class Solution {

public ListNode

removeNthFromEnd(ListNode head, int n) {

if(head == null) return head;

ListNode p = head,q = head;

int i = 0;//计数器

while(q != null){

if(i

> n) p = p.next; //距离为n的时候再开始后移

i++; q =

q.next;

}

if(i < n) return head;//n超范围

if(i == n) return head.next;//移除第一个节点

p.next = p.next.next;//移除非头节点

return head;

}

}

优化思路:在头结点前加一个节点dummy,这样方便移除头结点,​将一个指针指到第n个节点,然后另一个指针再从dummy一起后移直到前面的指针到头,移除该指针后面的节点,返回dummy后面的节点

优化代码:

public class Solution {

public ListNode

removeNthFromEnd(ListNode head, int n) {

if (n <= 0) {return null;}

ListNode dummy = new ListNode(0);

dummy.next = head;

ListNode preDelete = dummy;

for (int i = 0; i < n; i++) {

if (head

== null) {return

null;}

head =

head.next;

}

while (head != null) {

head =

head.next;

preDelete

= preDelete.next;

}

preDelete.next = preDelete.next.next;

return dummy.next;

}

}

​2.【Valid

Parentheses】(Easy)

一个字符串只包含'(',')','{','}','['和']'​,括号必须是对应的,如"()"和"()[]{}"正确,但"(]"和"([)]"错误。

解题思路:用栈类,将字符一一入栈,如果为空或不配对直接入,如果字符与栈顶字符配对则栈顶字符出栈,​直到遍历过所有字符,此时如果栈为空则true否则为false,当字符串为空时为true,为单字符时为false。

Accept代码:

public class Solution {

public boolean

isValid(String s) {

if(s.length() == 1) return

false;//单字符无配对

if(s.length() == 0) return

true;//空字符串

Stack stack = new Stack();

for(int i = 0; i

< s.length(); i++){

if(stack.empty()){

stack.push(s.substring(i,i+1)); continue; }//空栈直接入

if((s.substring(i,i+1).equals("}")

&& stack.peek().equals("{")) ||

(s.substring(i,i+1).equals(")") &&

stack.peek().equals("(")) || (s.substring(i,i+1).equals("]")

&&

stack.peek().equals("[")))

stack.pop();//配对则栈顶出栈

else

stack.push(s.substring(i,i+1));//否则入栈

}

if(stack.empty()) return

true;//空栈则表示全配对

else return false;

}

}

优化代码:

public class Solution {

public boolean

isValidParentheses(String s) {

Stack stack = new Stack();

for (Character c : s.toCharArray()) {

if ("({[".contains(String.valueOf(c)))

{//左括号入栈

stack.push(c);

} else

{//配对出栈

if (!stack.isEmpty()

&& is_valid(stack.peek(), c))

{

stack.pop();

} else {

return false;

}

}

}

return stack.isEmpty();

}

private boolean

is_valid(char c1, char c2) {

return (c1 == '('

&& c2 == ')') || (c1 == '{'

&& c2 == '}')

|| (c1 ==

'[' && c2 == ']');

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值