数据结构习题篇二

1、搜素二维矩阵

题目描述:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数

分析思路:二维数组,从上到下依次递增,从左到右也是依次递增,如图所示,从行最大的元素开始
查,比该位置元素的数字大的col++;比起元素小的row--,直到遍历完二维元素,row<0或者
col>arr[0].length,这样减少了遍历数组的次数,能够更快的查到元素。 
  

在这里插入图片描述

public class Solution {
    public boolean Find(int target, int [][] array) {
      //判断二维数组是否为空
        if(array==null||array.length==0||array[0].length==0){
            return false;
        }else{
        //获取行的最大行数,并从此处开始查询,比较此处元素是否比指定元素是否相同
        int row=array.length-1;
        int col=0;
        //查询出二维数组,row--之后col++;开始遍历二维数组,查找元素,
        while(row>=0&&col<array.length){
        //如果此角标元素比给定的元素大,row--
            if(array[row][col]>target){
                row--;
                //如果角标元素小于给定元素。col++;
            }else if(array[row][col]<target){
                col++;
                //如果角标元素等于给定的元素,返回true
            }else{
                return true;
            }
        }
      }
        return false;
    }
}
2.替换字符串

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

分析思路:通过构建动态字符串;首先遍历字符串,并把每个字符取出来,添加到构建的动态字符串
中,并比较去除的字符是否为空格,如果为空格,添加‘%’,‘2’,‘0’三个字符,最终返回动态字符串
    public String replaceSpace(StringBuffer str) {
        //首先判断字符串是否为空,如果为空,无法用空格替换“%20”
        if(str==null){
            return null;
        }
        //获取字符串长度,重新创建一个动态变化的字符串,根据字符长度,取出给定字符串中的字符
            //如果取到空字符串进行替换操作,向动态字符窗中添加“%20”字符,每次只能添加一个字符
            //如果不是空字符串,将str.charAt(i)中的字符添加到动态字符串中
        int len=str.length();
        StringBuilder sb = new StringBuilder();
        for(int i=0;i<len;i++){
           char c=str.charAt(i);
            if(c==' '){
                sb.append('%');
                sb.append('2');
                sb.append('0');
                 
            }else{
                sb.append(String.valueOf(str.charAt(i)));
            }
           
         }
         return new String(sb);
    }
}
3.字符串反转

题目描述:给定一个字符串,例如“I like beijing.,创建一个函数进行字符串的反打印,打印结果 ”beijing. like I;

分析思路:通过创建字符串数组将字符添加到字符串数组当中,此处用到split()方法,split() 方法用于
把一个字符串分割成字符串数组,并进行角标从未到头的遍历,并将其传到新的字符串数组中
import java.util.Scanner;
public class  Main{
     public static  void main(String[] args){
      Scanner scanner = new Scanner(System.in);
      String str =scanner nextLine();
      //以空格分割字符串构建字符串数组
      String[] str1 =str.split(" ");
      for(int i=0;i<str1.length;i++){
      System.out.println(str1[str1.length-i-1]+" ");
}
4.循环链表

题目描述:给定一个链表,判断链表是否是循环链表

思路分析:此处用到快慢指针,快指针到位之后如果为节点的元素的下一个元素为空,那么
该链表为空,尾节点的下一个节点不为空,通过指针的移动,最终慢指针会与快指针相遇
如图下所示

没有环的情况下

在这里插入图片描述

图一

在这里插入图片描述

图二

在这里插入图片描述

图四

在这里插入图片描述.

图四 fast.next=null&&slow!=fast

有环的情况下 fast=fast.next.next 而 slow =slow.next;

在这里插入图片描述
在这里插入图片描述

图一

在这里插入图片描述

图二

在这里插入图片描述

图三

在这里插入图片描述

图四
代码如下
public class Solution {
    public boolean hasCycle(ListNode head) {
        if(head==null||head.next==null){
            return false;
        }
        ListNode fast=head;
        ListNode slow=head;
        while(true){
            if(fast==null||fast.next==null){
                return false;
            }
            fast=fast.next.next;
            slow=slow.next;
            if(slow==fast){
                return true;
            }
        }
    }
}
class ListNode {
       int val;
       ListNode next;
      ListNode(int x) {
          val = x;
          next = null;
     }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值