算法学习——力扣刷题

本次所刷题以及答案的参考来自
链接: https://leetcode-cn.com/leetbook/read/illustration-of-algorithm/50ywkd/.

力扣刷题——剑指 Offer

  • 剑指 Offer 05. 替换空格
  • 剑指 Offer 06. 从尾到头打印链表**
  • 剑指 Offer 09. 用两个栈实现队列

剑指 Offer 05. 替换空格

请实现一个函数,把字符串 s 中的每个空格替换成"%20"。

 

示例 1:

输入:s = "We are happy."
输出:"We%20are%20happy."

class Solution {
    public String replaceSpace(String s) {
        StringBuilder res=new StringBuilder();
        for(char c:s.toCharArray()){
            if(c==' '){
                res.append("%20");
            }else{
                res.append(c);
            }
        }
        return res.toString();
    }
}
s.toCharArray()将字符串转化为数组

太久没有用java了,真的一点都不会用了。

剑指 Offer 06. 从尾到头打印链表**

下面展示一些 内联代码片

输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。

 

示例 1:

输入:head = [1,3,2]
输出:[2,3,1]
第一种用了递归的方法
 class ListNode{//链表
	int val;
	ListNode next;
	ListNode(int x) {
		// TODO Auto-generated constructor stub
		val=x;
	}
}
public class hand {
	ArrayList<Integer>temp=new ArrayList<>();
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		hand hand=new hand();
		ListNode head=new ListNode(1);
		ListNode h2=new ListNode(3);
		ListNode h3=new ListNode(2);
		head.next=h2;
		h2.next=h3;
		System.out.println(Arrays.toString(hand.reversePrint(head)) );	
	}
    public int[] reversePrint(ListNode head) {
    	int res[]=new int[temp.size()];
    	recur(head);
    	for (int i = 0; i < res.length; i++) {
			res[i]=temp.get(i);
		}
    	return res;
    }
	
	void recur(ListNode head) {//递归
		if (head==null) return;
		recur(head.next);
		temp.add(head.val);
	}
}

第二种用了栈的方式
    public int[] reversePrint(ListNode head) {
    	LinkedList<Integer> stack=new LinkedList<>();
    	while(head!=null) {
    		stack.addLast(head.val);;
    		head=head.next;
    	}
    	int res[]=new int[stack.size()];
    	for (int i = 0; i < res.length; i++) {
			res[i]=stack.removeLast();
		}
    	return res;
    }

下面展示一些 内联代码片

第三种:先找出链表的长度,然后倒着填入数组
    public int[] reversePrint(ListNode head) {
    	ListNode temp=head;
    	int h=0;
    	while(temp!=null) {
    		h++;
    		temp=temp.next;
    	}
    	
    	int[] res=new int[h];
    	h-=1;
    	while(head!=null) {
    		res[h--]=head.val;
    		head=head.next;
    	}
    	return res;
    }

剑指 Offer 09. 用两个栈实现队列

下面展示一些 内联代码片

用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )
public class hand {
	LinkedList<Integer> A,B;
	public  hand() {
		A=new LinkedList<>();
		B=new LinkedList<>();
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub	
	}
	 public void appendTail(int value) {
		 	A.addLast(value);
	    }	    
	    public int deleteHead() {
	    	if(!B.isEmpty())
	    		return B.removeLast();
	    	if (A.isEmpty()) {
				return -1;				
			}
	    	while(!A.isEmpty()) {
	    		B.addLast(A.removeLast());
	    	}
	    	return B.removeLast();
	    }
}
解析:
	A栈用来队尾的添加元素,当需要从队头进行删除元素时,需要将A栈中的元素
	全部移到B中,再对B进行删除。ifAB栈中的元素全为空时,说明这个队列中没
	有元素,那么进行删除操作的时候,返回1。

你可能感兴趣的:(android,算法,leetcode)