剑指Offer-week1

目录

1-找出数组中重复元素

2-不修改数组找出重复元素

3-二维数组中的查找

4-替换空格

 5-从尾到头打印链表  

6-重建二叉树--类似的题在天梯赛见到过


给自己一个小 taget 有目的才有动力

1-找出数组中重复元素

给定一个长度为 n 的整数数组 nums,数组中所有的数字都在 0∼n−1 的范围内。

数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。

请找出数组中任意一个重复的数字。

注意:如果某些数字不在 0∼n−1的范围内,或数组中不包含重复数字,则返回 -1;

special judge:

给每个数字分配一个坑,不在对应坑就交换并重复该操作。

class Solution {
public:
    int duplicateInArray(vector<int>& nums) {
          int n=nums.size();
          for(auto x:nums) if(x<0||x>=n)  return -1;
          for(int i=0;i<n;i++){
              while(nums[i]!=i&&nums[nums[i]]!=nums[i]) swap(nums[i],nums[nums[i]]);
              if(nums[i]!=i&&nums[nums[i]]==nums[i]) return nums[i];
          }
          return -1;
    } 
};

2-不修改数组找出重复元素

给定一个长度为 n+1 的数组nums,数组中所有的数均在 1∼n 的范围内,其中 n≥1。

请找出数组中任意一个重复的数,但不能修改输入的数组。

数据范围

1≤n≤1000

抽屉原理加分支,将数组划分为左右两边重复元素一定在么某一侧,如果说某一侧中区间内的数大于区间长度r-l+1说明重复元素在该侧,二分求解即可。

special judge:

class Solution {
public:
    int duplicateInArray(vector<int>& nums) {
          int n=nums.size();
          int l=1,r=n;
          while(l<r){
              int mid=(l+r)>>1;
              int s=0;
              for(auto x:nums) s+=(x>=l&&x<=mid);
              if(s>mid-l+1) r=mid;
              else l=mid+1;
              }
              return l;
    }
};

3-二维数组中的查找

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。

请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

数据范围

二维数组中元素个数范围 [0,1000]

副对角线上的元素同一行随校表增大而增大,同一列随下标增大而减小根据这个性质能在O(n+m)时间复杂度下求出target 是否存在。

return true or false

class Solution {
public:
    bool searchArray(vector<vector<int>> array, int target) {
         if(array.empty()||array[0].empty()) return false;
         int i=0,j=array[0].size()-1;
         while(i<array.size()&&j>=0){
             int x=array[i][j];
             if(x==target) return true;
             else if(x>target) j--;
             else i++;
         }
         return false;
    }
};

4-替换空格

给你一个字符串用“%20”替换当中的空格。

class Solution {
public:
    string replaceSpaces(string &str) {
         string res;
         for(int i=0;i<(int )str.size();i++){
             if(str[i]==' '){
                 res+="%20";
             }else res+=str[i];
         }
         return res;
    }
};

 5-从尾到头打印链表  

给你一个链表,按照从尾到头的顺序返回结点的值,返回的结果用一个数组来存储。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    vector<int> printListReversingly(ListNode* head) {
           vector<int >res;
           while(head) {
               res.push_back(head->val);
               head=head->next;
           }
           return  vector<int >(res.rbegin(),res.rend());
   }
};

6-重建二叉树--类似的题在天梯赛见到过

输入一棵二叉树前序遍历和中序遍历的结果,请重建该二叉树。

//前序遍历是 根->左儿子->右儿子,中序遍历是左儿子- >根->右儿子;

注意:

  • 二叉树中每个节点的值都互不相同;
  • 输入的前序遍历和中序遍历一定合法;

数据范围

树中节点数量范围 [0,100]。

给定:
前序遍历是:[3, 9, 20, 15, 7]
中序遍历是:[9, 3, 15, 20, 7]

返回:[3, 9, 20, null, null, 15, 7, null, null, null, null]
返回的二叉树如下所示:
    3
   / \
  9  20
    /  \
   15   7

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

litian355

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值