【剑指offer】编程习题集附上答案

简介: 【剑指offer】编程习题集附上答案

剑指offer~编程小哥令狐

一、数组类~

03、数组中重复的数字

class Solution
 {
    public void swap(int[] nums,int i,int j)
    {
        int temp=nums[i];
        nums[i]=nums[j];
        nums[j]=temp;
    }
    public int findRepeatNumber(int[] nums) 
    {
        int n=nums.length;
        for(int num:nums)
            if(num<0||num>=n)
                return -1;
        
        for(int i=0;i<n;i++)
        {
            while(nums[i]!=i&&nums[i]!=nums[nums[i]])
                swap(nums,i,nums[i]);
            if(nums[i]!=i&&nums[i]==nums[nums[i]])
                   return nums[i];
        }
         return -1;
    }
}

04、二维数组中的查找

  • 暴力查找
class Solution {
    public boolean findNumberIn2DArray(int[][] matrix, int target) {
        int i,j;
        if((matrix==null||matrix.length==0)||(matrix.length==1&&matrix[0].length==0))
            return false;
        for (i=0;i<matrix.length;i++)
            for (j=0;j<matrix[0].length;j++)
                if(matrix[i][j]==target)
                    return true;
        
        return false;
    } 
}
  • 线性查找
class Solution {
    public boolean findNumberIn2DArray(int[][] matrix, int target) {
        if((matrix==null||matrix.length==0)||(matrix.length==1&&matrix[0].length==0))
            return false;
        int i=0,j=matrix[0].length-1;
        while(i<=matrix.length-1&&j>=0){
            if(target==matrix[i][j]) return true;
            if(target>matrix[i][j]) i++;
            else if(target<matrix[i][j]) j--;
        }
        return false;
    } 
}

05、顺时针打印矩阵

class Solution {
    public int[] spiralOrder(int[][] matrix) {
        //判断边界
        if(matrix.length==0)
            return new int[0];//因为返回值是数组,所以实例化一个数组进行返回
        //右下左上
        int left=0,right=matrix[0].length-1,up=0,down=matrix.length-1;
        int num=0;
        int []res=new int[(right+1)*(down+1)];
        while(true){
            //右
            for(int i=left;i<=right;i++)
                res[num++]=matrix[up][i];
            if(++up>down) break;///判断边界
            //下
            for(int i=up;i<=down;i++)
                res[num++]=matrix[i][right];
            if(--right<left) break;
            //左
            for(int i=right;i>=left;i--)
                res[num++]=matrix[down][i];
            if(--down<up) break;
            //上
            for(int i=down;i>=up;i--)
                res[num++]=matrix[i][left];
            if(++left>right) break;
        }
        return res;
    }
}

06、在排序数组中查找数字

  • 暴力查找法
class Solution {
    public int search(int[] nums, int target) {
        int res=0;
        for(int i=0;i<nums.length;i++)
                if(nums[i]==target)
                    res++;
        return res;
            
    }
}
  • 二分查找法【有序数组优先考虑二分查找】
class Solution {
    public int search(int[] nums, int target) {
       int left = 0, right = nums.length;
        int ans = 0;
        while (left < right){
            int mid = left + ((right - left)/2);
            if (nums[mid] >= target){
                right = mid;
            } else {
                left = mid + 1;
            }
        }
        while (left < nums.length && nums[left++] == target){
            ans++;
        }
        return ans;
            
    }
}

07、剑指 Offer 53 - II. 0~n-1中缺失的数字

class Solution {
    public int missingNumber(int[] nums) {
         int left = 0, right = nums.length;
        while(left < right){
            int mid = left + (right - left) / 2;
            if (nums[mid] == mid) {
                left = mid + 1;
            } else {
                right = mid;
            }  
        }
        return left;
    }
}

二、链表类~

06、从尾到头打印链表

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public int[] reversePrint(ListNode head) {
        ListNode temp=head;
        int size=0;
        while(temp!=null){
            size++;
            temp=temp.next;
        }
        int[] res=new int[size];
        temp=head;
        for(int i=size-1;i>=0;i--){
            res[i]=temp.val;
            temp=temp.next;
        }
        return res;
    }
}

07、删除链表节点

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode deleteNode(ListNode head, int val) {
        if(head.val==val) return head.next;
        ListNode pre=head;
        ListNode cur=head.next;
        while(cur.val!=val&&cur!=null){
            pre=cur;
            cur=cur.next;
        }
        if(cur.val==val){
            pre.next=cur.next;
        }
        return head;
    }
}


目录
相关文章
|
11月前
|
算法
【AcWing算法基础课】第五章 动态规划(未完待续)(3)
当然,一个人能够滑动到某相邻区域的前提是该区域的高度低于自己目前所在区域的高度。
99 0
|
5月前
|
算法 Java C++
字符串删减(蓝桥杯每日一题)
字符串删减(蓝桥杯每日一题)
62 0
|
11月前
|
算法
【AcWing算法基础课】第五章 动态规划(未完待续)(1)
求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且 总价值最大 。
61 0
【AcWing算法基础课】第五章 动态规划(未完待续)(1)
|
11月前
|
算法
代码随想录算法训练营第二十四天 | LeetCode 77.组合
代码随想录算法训练营第二十四天 | LeetCode 77.组合
85 0
|
11月前
|
人工智能 算法 JavaScript
【AcWing算法基础课】第五章 动态规划(未完待续)(2)
给定一个如下图所示的数字三角形,从 顶部 出发,在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点, 一直走到底层 ,要求找出一条路径,使 路径上的数字的和最大。
61 0
《蓝桥杯每日一题》双指针·AcWing 3768. 字符串删减
《蓝桥杯每日一题》双指针·AcWing 3768. 字符串删减
59 0
|
机器学习/深度学习 存储 人工智能
C语言程序设计第五版谭浩强课后答案 第五章习题答案(3-17题)
C语言程序设计第五版谭浩强课后答案 第五章习题答案(3-17题)
|
算法
【蓝桥杯集训·每日一题】AcWing 3768. 字符串删减
文章目录 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 三、知识风暴 双指针
76 0
|
数据安全/隐私保护
蓝桥杯2020年第十一届JavaB组真题题目+解析+代码+答案:1.解密
蓝桥杯2020年第十一届JavaB组真题题目+解析+代码+答案:1.解密
98 0
蓝桥杯2020年第十一届JavaB组真题题目+解析+代码+答案:1.解密
|
算法
【牛客刷题-算法】3-第一篇-斐波拉契数列-C实现
【牛客刷题-算法】3-第一篇-斐波拉契数列-C实现
89 0
【牛客刷题-算法】3-第一篇-斐波拉契数列-C实现