【剑指OFFER-二刷】

【回眸】剑指offer(一)剑指offer怎么刷 最近有刷算法方面的需要,直接搜出来的学习建议和技巧都太宽泛,而且夹杂着很多广告。借助第二大脑给自己提了一些建议和计划,希望也能帮助到屏幕面前的你! 阅读详情

反转链表

输入一个链表,反转链表后,输出链表的所有元素。

不借助任何多余空间,代码如下:

/*
public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}*/
public class Solution {
    public ListNode ReverseList(ListNode head) {
        if(head == null)
            return null;

        ListNode left = head;
        ListNode current = head;
        ListNode right = head.next;

        while(current.next != null) {
            current.next = right.next;
            right.next = left;
            left = right;
            right = current.next;
        }
        return left;
    }
}

重建二叉树

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

一定要注意确定前后界限,可以用个例子去试。

/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
        if(pre == null || in == null)
            return null;

        return reConstructBinaryTree(pre, in, 0, pre.length, 0, in.length);
    }
    public TreeNode reConstructBinaryTree(int[] pre, int[] in, int preS, int preE, int inS, int inE) {
        if(preE <= preS || inE <= inS)
            return null;

        int i = inS;
        int count = 0;
        for(; i < inE && in[i] != pre[preS]; i++) {count++;}

        TreeNode root = new TreeNode(pre[preS]);
        root.left = reConstructBinaryTree(pre, in, preS+1, preS+1+count, inS, inS+count);
        root.right = reConstructBinaryTree(pre, in, preS+1+count, preE, inS+count+1, inE);

        return root;
    }
}

字符串的排列

回溯法实现全排列。这里利用set实现去重的目的。

import java.util.ArrayList;
import java.util.*;

public class Solution {
    public ArrayList<String> Permutation(String str) {
        ArrayList<String> result = new ArrayList<>();
        if(str == null || str.length() == 0)
            return result;
        HashSet<String> set = new HashSet<>();
        Permutation(set, str.toCharArray(), 0);
        result.addAll(set);
        Collections.sort(result);
        return result;
    }

    public void Permutation(HashSet<String> set, char[] array, int k) {
        if(k > array.length - 1) {
            set.add(new String(array));
            return;
        }
        for(int i = k; i < array.length; i++) {
            swap(array, k, i);
            Permutation(set, array, k+1);
            swap(array, k, i);
        }
    }

    public void swap(char[] array, int a, int b) {
        char tmp = array[a];
        array[a] = array[b];
        array[b] = tmp;
    }
}

数组中只出现一次的数字

//num1,num2分别为长度为1的数组。传出参数
//将num1[0],num2[0]设置为返回结果
public class Solution {
    public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
        if(array == null || array.length <= 1) {
            num1[0] = 0;
            num2[0] = 0;
            return;
        }
        int diff = array[0];
        for(int i = 1; i < array.length; i++) 
            diff ^= array[i];

        String str = Integer.toBinaryString(diff);
        int index = str.length() - 1;
        for(; index >= 0; index--) {
            if(str.charAt(index) != '0')
                break;
        }
        index = str.length() - 1 - index;

        for(int i = 0; i < array.length; i++) {
            if(isBitZero(array[i], index))
                num1[0] ^= array[i];
            else
                num2[0] ^= array[i];
        }
    }

    public boolean isBitZero(int n, int index) {
        int assi = 1;
        for(int i = 0; i < index; i++)
            assi <<= 1;
        return ((assi & n) == 0) ? true : false;
    }
}

数组中重复的数字

这个解法时间复杂度O(N),不新建空间。很巧妙。

public class Solution {
    // Parameters:
    //    numbers:     an array of integers
    //    length:      the length of array numbers
    //    duplication: (Output) the duplicated number in the array number,length of duplication array is 1,so using duplication[0] = ? in implementation;
    //                  Here duplication like pointor in C/C++, duplication[0] equal *duplication in C/C++
    //    这里要特别注意~返回任意重复的一个,赋值duplication[0]
    // Return value:       true if the input is valid, and there are some duplications in the array number
    //                     otherwise false
    public boolean duplicate(int numbers[],int length,int [] duplication) {
        if(numbers == null || numbers.length == 0 || length == 0)
            return false;
        for(int i = 0; i < length; i++) {
            int index = numbers[i];
            if(index < 0)
                index += length;
            if(numbers[index] < 0) {
                duplication[0] = index;
                return true;
            }
            else
                numbers[index] = numbers[index] - length;

        }
        return false;
    }
}

链表中环的入口结点

下面的解法很巧妙,遍历环的时候把上面的结点与这个结点解锁,这样最后一个没有next的就是环的入口节点。

/*
 public class ListNode {
    int val;
    ListNode next = null;

    ListNode(int val) {
        this.val = val;
    }
}
*/
public class Solution {

    public ListNode EntryNodeOfLoop(ListNode pHead)
    {
        if(pHead == null || pHead.next == null)
            return null;
        while(pHead.next != null) {
            ListNode p = pHead.next;
            pHead.next = null;
            pHead = p;
        }
        return pHead;
    }
}
剑指offer刷题笔记 剑指offer刷题笔记(一),大概完成40多道题,语言c++,python,java 立即下载

相关推荐

现场总线课程设计-基于modbus协议使用QT实现主从站控制通信

【平台:QT】 【协议:modbus(注:由于要求,需要自己来实现modbus库,而非直接调用已有的库)】 【由于复制粘贴,时间原因可能格式有误,如需要具体工程文件以及报告文件请私信博主】 1、 大作业任务: (1)使用附件中工具软件体验MODBUS主从站数据传输过程(可在主从站模拟工具里面观察各功能码对应数据帧内容并对其进行分析) (2)使用串口调试助手,手工发出MODBUS主、从站该发出的数据,并观察对方发出的数据 (3)实现MODBUS主、从站功能,描述实现过程(语言不限于使用VC

weixin_44469597的博客 4066

刷题两个月,从入门到字节跳动offer,这是我的模板 | GitHub 1.2k星

点击上方“GitHubPorn”,选择“星标”公众号重磅干货,第一时间送达白交 发自 凹非寺量子位 报道 | 公众号 QbitAI刷题应该这样刷。最近,一位网友在GitHub上分享了他...

程序员吴师兄的博客 682

SNAP实战:Sentinel-1 GRD数据从预处理到后向散射系数生成全流程解析

本文详细解析了Sentinel-1 GRD数据从预处理到后向散射系数生成的全流程,包括辐射定标、噪声处理、地形校正等关键步骤。通过SNAP软件实战操作,帮助用户掌握SAR影像处理技巧,提升数据质量与分析效率,适用于地表变化监测、灾害评估等应用场景。

weixin_29239661的博客 538

剑指 Offer 浅刷浅刷(普通版)

剑指 Offer 09. 用两个栈实现队列 class CQueue { public: stack <int> headStack; stack <int> rearStack; CQueue() { } void appendTail(int value) { headStack.push(value); } int deleteHead() { if

m0_55124878的博客 2106

STM32F407 FreeRTOS+LVGL移植实战:从驱动适配到性能优化

本文详细介绍了在STM32F407开发板上移植FreeRTOS和LVGL的实战经验,涵盖硬件准备、驱动适配、性能优化等关键步骤。通过TFTLCD屏幕驱动优化、DMA加速和任务优先级调整,显著提升界面流畅度,为嵌入式GUI开发提供实用解决方案。

weixin_29190651的博客 635

SLUB DEBUG 检测slab 内存泄漏

文章介绍如何定位linux 内核中slab 内存泄漏。

一叶知秋的博客 1491

速刷剑指offer

JZ11 旋转数组的最小数字第五题跳过。栈和队列等着代码随想录二刷补上。JZ11 旋转数组的最小数字代码:这个二分法是左闭右开的,就真的不好理解。非正确思路:每次pop都要把stack2中的所有元素装回stack1正确思路,每次pop只是pop出stack2的栈顶元素,当stack2为空时,才一次性倒入所有stack1的元素。No10、矩阵覆盖思路:No11、二进制中1的个数思路:n&(n-1)把n最低位的1变0这道题用到了快速幂。可以复习一下.(1)快速幂+递归d第一种:快慢指针。

isabelightL的博客 495

跨境TRS投资操作指南与系统解决方案

3 点击【申请 TRS 账户】,查看风险披露,录入账户参数、确定录入的参数信息,进行身份验证,输入验证码,TRS 账户开户申请已提交,后台对已提交的 TRS 开户申请进行审核,审核成功后,短信邮箱提醒,进行登录;2.点击【申请TRS账户】,查看风险披露,录入账户参数、确定录入的参数信息,进行身份验证,输入验证码,TRS账户开户申请已提交,后台对已提交的TRS开户申请进行审核,审核成功后,短信邮箱提醒,进行登录;4)更广泛的投资选择:相比A股通,TRS可以交易更多的A股标的,提供了更广泛的投资选择。

2401_85487119的博客 2853

【LeetCode】剑指 Offer <二刷>(7)

剑指 Offer 14- I. 剪绳子 剑指 Offer 14- II. 剪绳子 II

Locky136的博客 778

Android Audio录音——AudioRecord回声消除(九)

在语音通话或录音场景中,回声(Acoustic Echo)通常是指说话的声音从对方的扬声器播放出来,又被对方的麦克风拾取,然后有被传回来,导致我们听到了自己延迟了一段时间的重复声音。

小旭的专栏 1405

【Claude】Invalid model / Opus not available 错误:模型不可用的原因 bug报错已解决

使用 Claude API 时,指定错误或不可用的模型 ID 会收到 Invalid model 错误。本文从模型命名规则出发,给出模型降级链与动态选择方案。

博客 7915

剑指offer总结

第一次刷刷剑指offer历经两个多月(2020.2~2020.3),由于基础薄弱,现在基本上都忘记了,这一次计划性二刷并进行相应总结。 ------- 2020.5.2于武汉 字符 ...

weixin_43892514的博客 251

UE实现贴地线(SurfaceLine)效果

UnrealEngine实现贴地线效果

专注GIS开发 4572

【剑指offer 二刷】问题整理

目录剑指Offer11.旋转数组的最小数字 这是二刷时候遇到问题的题目,只要感觉不太对了就记录在这里。 剑指Offer11.旋转数组的最小数字

weixin_37779325的博客 281

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

剑指offer——java刷题总结【二】

目录 题号 题目名称 11 二进制中1的个数 12 数值的整数次方 13 调整数组顺序使奇数位于偶数前面 14 链表中倒数第k个结点 15 反转链表 16 合并两个排序的链表 17 树的子结构 18 二叉树的镜像 19 顺时针打印矩阵 20 包含min函数的栈 Note 代码地址:Github 剑指offer刷题总结 有些解法博文中未实现,...

编码强迫症患者 887

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

剑指offer二刷(精刷)

剑指 Offer 03. 数组中重复的数字 题目描述 在一个长度为 n 的数组里的所有数字都在 0 到 n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字是重复的,也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 Input: {2, 3, 1, 0, 2, 5} Output: 2 解题思路 要求时间复杂度 O(N),空间复杂度 O(1)。因此不能使用排序的方法,也不能使用额外的标记数组。 对于这种数组元素在 [0, n-1] 范围内的问题,可以将值为 i 的元素调整到

kopoo的博客 583

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

【LeetCode】剑指 Offer <二刷>(4)

剑指 Offer 09. 用两个栈实现队列 剑指 Offer 10- I. 斐波那契数列

Locky136的博客 1371

【LeetCode】剑指 Offer <二刷>(1)

剑指 Offer 03. 数组中重复的数字

Locky136的博客 948

春招刷题笔记——剑指offer二

剑指offer-数据结构一剑指offer-数据结构1. 数组1.1 数组中的重复数字1.2 二维数组中的查找2.字符串2.1 替换字符串2.3 链表2.3.1 从尾到头打印链表 剑指offer-数据结构 1. 数组 1.1 数组中的重复数字 (1)面试题3(一):找出数组中重复的数字 题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也...

GorMing 的博客 247

二刷剑指Offer:剑指Offer+LeetCode(全53题)

文章目录剑指Offer刷题67. 剪绳子(贪心算法)66. 机器人的运动范围(dfs)65. 矩阵中的路径(回溯算法)64. 滑动窗口的最大值(双端队列)63. 数据流中的中位数62. 二叉搜索树的第k大节点(Leedcode)62. 二叉搜索树的第k小节点(中序遍历)61. 序列化二叉树(Leetcode)61. 序列化二叉树(层序遍历)60. 把二叉树打印成多行(层序遍历)59. 按之字形打印二叉树(层序遍历)58. 对称的二叉树(bfs)57. 二叉树的下一个节点(线索化)56. 删除排序链表中的重复

你今天真好看呀 2055

二刷剑指offer

目录 1.二进制中1的个数 2.重建二叉树 3.二叉搜索树的后叉遍历序列 4.二叉树中和为某一值的路径 5.数组中出现次数超过一半的数字 6.整数中1出现的次数 7.把数组排成最小的数 8.数组中的逆序对 9.两个链表的第一个公共节点 10.数字在排序数组中出现的次数 11.丑数 12.数组中只出现一次的数字 13.和为S的正数序列 14.左旋转字符串 15.求1+2...

IMUHERO 538

剑指Offer题解——随机刷题(二)

文章目录剑指 Offer 51. 数组中的逆序对分治算法剑指 Offer 56 - I. 数组中数字出现的次数位运算剑指 Offer 56 - II. 数组中数字出现的次数 II位运算剑指 Offer 57. 和为s的两个数字双指针剑指 Offer 57 - II. 和为s的连续正数序列双指针推荐阅读 剑指 Offer 51. 数组中的逆序对 剑指 Offer 51. 数组中的逆序对 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。

wardseptember的博客 558

剑指offer-二刷

09.用两个栈实现队列力扣 错误点: 1.栈定义 Stack<Integer>A = new LinkedList<>() 是错误的 Stack<Integer> a = new Stack<>();或者 LinkedList<Integer> l = new LinkedList<>(); 思路: 添加时直接在A中加,B相当于A的倒序。删除时要考虑三种情况,当B中有元素,直接删;AB都没元素时,要返回-1;剩下的只有A..

m0_51608959的博客 347

《剑指offer》算法题二刷整理

123

ShenHang_的博客 482

7天刷完剑指offer(二)

题库来源:牛客网 《7天刷完剑指offer》系列只提供解题思路,代码实现见牛客网 数值的整数次方 题目: 思路 解法1: 暴力法。exponent个base相乘,循环exponent次。时间复杂度:O(n),空间复杂度:O(1) 解法2: 快速幂。已知basee=(basee2)2base^e = (base^{\frac{e}{2}})^2basee=(base2e​)2, 如果e 是偶数。当e是奇数,basee=(basee2)2∗basebase^e = (base^{\frac{e}{2}})^2

banban008的博客 272

剑指offer刷题复习(简单二)

剑指 Offer 11. 旋转数组的最小数字 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。 示例 1: 输入:[3,4,5,1,2] 输出:1 示例 2: 输入:[2,2,2,0,1] 输出:0 解题思路: java排序返回第一个,python直接用min方法 java class Solution { public int

qq_30312047的博客 144
上一篇: 【JAVA】堆实现
下一篇: 【CDMI-PROJECT】DAILY SUMMURY
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值