首页 > 其他分享 >《剑指offer》day13

《剑指offer》day13

时间:2022-10-18 15:58:22浏览次数:64  
标签:String offer int 复杂度 nums result day13 指针

调整数组顺序使奇数位于偶数前面

题目描述

image

思路

双指针

代码实现

双指针

class Solution {
    public static void main(String[] args) {
        int [] nums={1,2,3,4};
        exchange(nums);
    }
    public static int[] exchange(int[] nums) {
        int i=0,j=nums.length-1;
        while(i<j){
            while(i<j&&(nums[i]&1)==1)i++;
            while(i<j&&(nums[j]&1)==0)j--;
            int tmp=nums[i];
            nums[i]=nums[j];
            nums[j]=tmp;
        }
        return nums;
    }
}

复杂度分析

时间复杂度

O(N)

空间复杂度

O(1)

反思不足

思路

思路很模糊,结构化、可视化以及debug建议都用用

和为s的两个数字

题目描述

image

思路

双指针+二分查找

自己的思路,虽然不咋地但毕竟是自己想的

双指针+对撞指针

需要看到一个规律:

不等于目标值,要么小于要么大于,小于的情况下,要增大,于是可以移动左指针,反之同理

代码实现

双指针+二分查找

class Solution {
    public int[] twoSum(int[] nums, int target) {
        //确定边界
        int l=0,r=nums.length-1,mid=l+(r-l)/2;;
        //一个遍历,一个二分查找
        while(l<=r){
            if(nums[mid]>target)r=mid-1;
            else l=mid+1;
            mid=l+(r-l)/2;
        }
        int len=r;
        int i=0;
        for(i=0;i<len;i++){
            l=i;
            mid=l+(r-l)/2;
            while(l<=r){
                if(nums[mid]+nums[i]==target)break;
                else if(nums[mid]+nums[i]<target)l=mid+1;
                else r=mid-1;
                mid=l+(r-l)/2;
            }
            if(l<=r)break;
        }
        int [] result={nums[i],nums[mid]};
        return result;
    }
}

双指针+对撞指针

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int l=0,r=nums.length-1;
        while(l<r){
            int s=nums[l]+nums[r];
            if(s<target)l++;
            else if(s>target)r--;
            else return new int[] {nums[l],nums[r]};
        }
        return new int[]{};
    }
}

复杂度分析

时间复杂度

二分查找那个O(NlogN),对撞指针O(N)

空间复杂度

O(1)

反思不足

思路

看到有序数组能想到二分查找,是好的,比暴力好

不足之处在于没能看出数量关系,对对撞指针也没什么概念

java se

return new int[]{};

题目描述

image

思路

库函数法

分割,然后倒着拼接

双指针

用两个指针维护单词的边界,挨个去找

代码实现

库函数法

class Solution {
    public String reverseWords(String s) {
        String [] strs = s.split("[ ]+");
        StringBuilder result=new StringBuilder();
        for(int i=strs.length-1;i>=0;i--){
            result.append(strs[i]+" ");
        }
        return result.toString().trim();
    }
}

双指针法

class Solution {
    public String reverseWords(String s) {
        
        String s_=s.trim();
        int i=s_.length()-1,j=i;
        StringBuilder result=new StringBuilder();
        while(i>=0){
            while(i>=0&&s_.charAt(i)!=' ')i--;
            result.append(s_.substring(i+1,j+1)+" ");
            while(i>=0&&s_.charAt(i)==' ')i--;
            j=i;
        }
        return result.toString().trim();
    }
}

复杂度分析

时间复杂度

库函数法为O(N),所调用的api均不超过这个数量级

双指针亦为O(N)

空间复杂度

因为有个StingBuilder,所以均为O(N)

反思不足

思路

标签:String,offer,int,复杂度,nums,result,day13,指针
From: https://www.cnblogs.com/zhouj-learn/p/16802825.html

相关文章

  • 保10万涨薪、保Offer、保大厂,1V1私教服务上线啦!
    受大行情影响目前整个互联网行业的就业形势日渐严峻,上半年保住工作,下半年保住老板。裁员潮一波接一波,很多大厂也加入了裁员行列,裁员比例超过30%。有些同学辞职之后,很久没......
  • 《剑指offer》day12
    合并两个排序的链表题目描述思路双指针自己想的,就普通的双指针,结构化讨论对于第一个节点的确定,自己的思路没问题,提供一种其他思路,用一个伪头节点代码实现双指针......
  • 《剑指offer》day11
    删除链表的节点题目描述思路基本操作代码实现/***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNodenext;*......
  • 剑☞offer 替换空格
    请实现一个函数,把字符串s中的每个空格替换成"%20"。例子:输入:s="Wearehappy."输出:"We%20are%20happy."代码参考点击查看代码classSolution{public:st......
  • 代码随想录 反转字符串(LeetCode 344) ,反转字符串II(LeetCode 541),替换空格(剑指offer
    反转字符串题目编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组char[]的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用......
  • 剑指offer题解
    一,常见数据结构1,数组3-找出数组中重复的数字4-二维数组中的查找5-替换空格29-顺时针打印矩阵leetcode989-数组形式的整数加法leetcode26-删除有序数组中的重复......
  • 《剑指offer》day09
    题目描述思路动态规划+自下而上记录每个元素对应的包含了当前元素的连续和的最大值,最后取一个全局最大的自下而上的话就没有必要保留,一边求一边更新即可递归的话也......
  • 《剑指offer》day08
    斐波那契数列题目描述思路动态规划+哈希表+递归动态规划维基百科定义:动态规划(英语:Dynamicprogramming,简称DP),是一种在数学、管理科学、计算机科学、经济学和生物......
  • 剑指 Offer 05. 替换空格
    请实现一个函数,把字符串 s 中的每个空格替换成"%20"。classSolution{public:stringreplaceSpace(strings){intlen=s.size();intcoun......
  • 剑指offer 38. 字符串的排列
    输入一个字符串,打印出该字符串中字符的所有排列。你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。示例:输入:s="abc"输出:["abc","acb","bac","bca","cab","......