19.7.1剑指offer

1.二维数组中的查找

题目:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
思路
由于二维数组按照顺序排列,所以可以选择从右上角或者左下角进行判断的开始
以右上角为例,左边的值小于它,下一行的值大于它,所以如果target>x,则row++;若小于col–;否则相同

代码:

public class Solution {
    public boolean Find(int target, int [][] array) {
        int row =0;
        int col = array[0].length-1;
        //从右上角开始判别
        while(col>=0 && row <=  array[0].length-1){
            if(target == array[row][col])
                return true;
            //如果目标值大于这个数,则row++
            else if(target > array[row][col])
                row++;
            else
                col--; 
        }
        return false;
    }
}



2.替换空格

**题目:**请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
思路:

  • 暴力解法(复杂度O(n2)):从前往后,遇到空格则将其后所有数后移并替换
  • 复杂度(O(n))从后往前进行空格的替换,不需要移动。
    • 首先计算出需要移动的总位数(3n-n,n为有效空格数)
    • 将最后一个非空格字符后移,直至遇见空格为止
    • 重复上述操作
      代码:
    public String replaceSpace(StringBuffer str) {
        int spacenum = 0;//spacenum为计算空格数
        for(int i=0;i=0;--indexold){  
                if(str.charAt(indexold) == ' '){  
                str.setCharAt(indexnew--, '0');
                str.setCharAt(indexnew--, '2');
                str.setCharAt(indexnew--, '%');
                }else{
                    str.setCharAt(indexnew--, str.charAt(indexold));
                }
        }
        return str.toString();
    }

拓展
合并两个数组(或字符串)时,可以选择从后往前复制,减少移动次数


3.从尾到头打印链表

题目:输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。
思路1:利用栈实现
先把链表顺序入栈,然后依次弹出(利用栈:先进后出的特点
代码

import java.util.ArrayList;
import java.util.Stack;
public class Solution {
    public ArrayList printListFromTailToHead(ListNode listNode) {
        Stack stack = new Stack<>();
        while(listNode!=null){
            stack.push(listNode.val);
            listNode = listNode.next;
        }
        
        ArrayList res = new ArrayList<>();
        while(!stack.isEmpty()){
            res.add(stack.pop());
  	  } 
        return res;
	}
}

思路2: 递归本质上是一个栈结构,所以可以用递归实现
只要listNode不为空,那么就递归调用printListFromTailToHead方法,直至遍历完这个链表为止;
返回上一层迭代:res.add(listNode.val)//添加本层迭代所拥有的节点(即尾节点),返回res链表;
返回上一层迭代:res.add(listNode.val)//添加本层迭代所拥有的节点(即倒数第二个节点),返回res链表;
重复上述迭代操作。

代码:

import java.util.ArrayList;
public class Solution {
    ArrayList res = new ArrayList<>();
    public ArrayList printListFromTailToHead(ListNode listNode) {
        if(listNode!=null){
            printListFromTailToHead(listNode.next);
            res.add(listNode.val);
        }
        return res;
    }
}

你可能感兴趣的:(LeetCode)