首页 > 其他分享 >剑指offer刷题 进度:JZ8

剑指offer刷题 进度:JZ8

时间:2023-04-20 21:55:49浏览次数:50  
标签:node begin return string offer int vector JZ8 刷题

题目列表

https://www.nowcoder.com/ta/coding-interviews

JZ3 数组中重复的数字

时间空间复杂度都为\(O(n)\),直接建一个数组a,初始化全0,出现数i就a[i]++

    int duplicate(vector<int>& numbers) {
        const int N = 10005;
        vector<int> count(N, 0);
        for(int i = 0; i < numbers.size(); i ++){
            count[numbers[i]] ++;
        }
        for(int i = 0; i < count.size(); i ++){
            if(count[i] > 1){
                return i;
            }
        }
        return -1;
    }

JZ4 二维数组中的查找

由题:二维数组从左到右从上到下递增,则a[i][j]是该元素到右下角的矩阵里最小的元素
为了控制不走回头路,从右上方或者左下方的元素开始。
从右上方开始:target < a[i][j], target在该列左边
target > a[i][j], target在该行下方
如果超出了矩阵范围还没找到,说明没有这个数。

    bool Find(int target, vector<vector<int> > array) {
        int row = array.size() - 1;
        int col = array[0].size() - 1;
        if(array.empty() || array[0].empty()) return false;
        int i = 0, j = col;
        while(i <= row && j >= 0){
            if(target > array[i][j])
                i ++;
            else if(target < array[i][j])
                j --;
            else{
                return true;
            }
        }
        return false;
    }

JZ5 替换空格

复习了一下string的用法
既可以用str[i]直接遍历,也可以用iterator遍历,改字符可以用string.insert
注意string.append用法

//s[i]写法
    string replaceSpace(string s) {
        // write code here
        for(int i = 0; i < s.size(); i ++){
            if(s[i] == ' '){
                s[i] = '%';
                s.insert(i + 1, "20");
            }
        }
        return s;
    }
//iterator写法
    string replaceSpace(string s) {
        // write code here
        int length = s.length();
        string ans = "";
        string::iterator iter = s.begin();
        for(; iter < s.end(); iter ++){
            if(*iter == ' ')
                ans.append("%20");
            else {
                ans.append(iter, iter + 1);
            }
        }
        return ans;
    }

JZ6 从尾到头打印链表

vector逆序写法
反向迭代器:rbegin()指向最后一个元素,rend()指向第一个元素前面的位置

    vector<int> printListFromTailToHead(ListNode* head) {
        vector<int> res;
        ListNode* l;
        l = head;
        while(l != nullptr){
            res.push_back(l -> val);
            l = l -> next;
        }
        return vector<int>(res.rbegin(), res.rend());
    }

JZ7 重建二叉树

用递归做,根据前序遍历序列的第一个数(当前根节点)把中序遍历分成左右子树,根据左右子树序列的长度,分出左右子树的前序遍历序列,对左右子树进行递归,返回值分别为当前root的left和right

    TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
        if(pre.empty() || vin.empty()) return NULL;
        TreeNode *treenode = new TreeNode(pre[0]);
        int l = distance(vin.begin(), find(vin.begin(), vin.end(), pre[0]));
        vector<int> pre1(pre.begin() + 1, pre.begin() + l + 1);
        vector<int> pre2(pre.begin() + l + 1, pre.end());
        vector<int> vin1(vin.begin(), vin.begin() + l);
        vector<int> vin2(vin.begin() + l + 1, vin.end());
        treenode -> left = reConstructBinaryTree(pre1, vin1);
        treenode -> right = reConstructBinaryTree(pre2, vin2);

        return treenode;
    }

JZ8 二叉树的下一个结点

分类讨论:1. 没有右子树,返回寻找父节点,如果当前节点是父节点的右儿子,就继续向上寻找父节点,直到当前节点是父节点的左儿子。如果无父节点返回null
2.有右子树,找右子树中最左边的节点。
段错误一发,原因是分类讨论1时,找父节点忘记判断父节点是否存在

    TreeLinkNode* GetNext(TreeLinkNode* pNode) {
        TreeLinkNode* node;
        if(pNode == nullptr) return NULL;
        if(pNode -> right == nullptr){
            if(pNode -> next == nullptr) return NULL;
            node = pNode->next;
            while(node->right == pNode){
                pNode = node;
                if(node->next == nullptr) return NULL;
                node = node->next;
            }
            return node;
        }
        else{
            node = pNode->right;
            while(node->left != nullptr){
                node = node->left;
            }
            return node;
        }
    }

标签:node,begin,return,string,offer,int,vector,JZ8,刷题
From: https://www.cnblogs.com/moomight/p/17338478.html

相关文章

  • OJ刷题之旅
    题目描述求11到n之间(包括n),既是素数又是回文数的整数有多少个。输入一个大于11小于1000的整数n。输出11到n之间的素数回文数个数。样例输入23输出1提示回文数指左右对称的数,如:292,333。来源/分类循环结构题解#include<stdio.h>intis_prime(intnum){inti;......
  • 二分查找:剑指 Offer 11. 旋转数组的最小数字
    题目描述:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。给你一个可能存在 重复 元素值的数组 numbers ,它原来是一个升序排列的数组,并按上述情形进行了一次旋转。请返回旋转数组的最小元素。例如,数组 [3,4,5,1,2]为[1,2,3,4,5]的一次旋转,该数组的最......
  • leetcode刷题随笔(2)
    42.收集雨水(TrappingRainWater)方法一:利用双指针交叉循环求解,时间复杂度O(n)//接雨水inttrap(vector<int>&height){inti=0,j=height.size()-1;intleft_max=0,right_max=0;intvan=0;while(i<j){if(height[i]......
  • 算法刷题系列——二分查找
    704.二分查找(2023.4.17)给定一个 n 个元素有序的(升序)整型数组 nums和一个目标值 target ,写一个函数搜索 nums 中的target,如果目标值存在返回下标,否则返回-1。示例1:输入:nums=[-1,0,3,5,9,12],target=9输出:4解释:9出现在nums中并且下标为4示例 2:......
  • leetcode刷题随笔(1)
     11.盛水最多的容器暴力求解超时问题的解决intmaxArea(vector<int>&height){intmax=0;intn=height.size();intnum;inti,j;for(i=0;i<n;i++)for(j=0;j<n;j++){if(i<j)......
  • 动态规划:剑指 Offer 63. 股票的最大利润
    题目描述:假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少? 限制:0<=数组长度<=10^5    classSolution{publicintmaxProfit(intprices[]){//状态定义:dp[i]记为利润profit//前i......
  • 【LeetCode剑指offer 03】合并两个/K个排序链表
    合并两个排序链表https://leetcode.cn/problems/he-bing-liang-ge-pai-xu-de-lian-biao-lcof输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。示例1:输入:1->2->4,1->3->4输出:1->1->2->3->4->4限制:0<=链表长度<=1000思路代码classSolutio......
  • 剑指 Offer 45. 把数组排成最小的数
    题目链接:剑指Offer45.把数组排成最小的数方法:排序解题思路将数字转化为字符串数组,然后\(sort()\);cmp()函数staticboolcmp(stringa,stringb){returna+b<b+a;}代码//写法一classSolution{public:staticboolcmp(stringa,stringb){......
  • 【剑指 Offer】67. 把字符串转换成整数
    【题目】写一个函数StrToInt,实现把字符串转换成整数这个功能。不能使用atoi或者其他类似的库函数。 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起......
  • Python3 列表生成式和最近刷题遇到问题
    python3创建二维数组需要用到列表生成式列表生成式即ListComprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。举个例子,要生成list [1,2,3,4,5,6,7,8,9,10]可以用list(range(1,11)):>>>list(range(1,11))[1,2,3,4,5,6,7,8,9,10]......