0124 双指针 Day13
创始人
2024-04-23 09:15:09
0

剑指 Offer 21. 调整数组顺序使奇数位于偶数前面

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分。

示例:

输入:nums = [1,2,3,4]
输出:[1,3,2,4] 
注:[3,1,2,4] 也是正确的答案之一。

class Solution {public int[] exchange(int[] nums) {}
}

解题思路

算法流程:
初始化: i , j 双指针,分别指向数组 nums 左右两端;
循环交换: 当 i = j 时跳出;
指针 i 遇到奇数则执行 i = i + 1 跳过,直到找到偶数;
指针 j 遇到偶数则执行 j = j - 1 跳过,直到找到奇数;
交换 nums[i] 和 nums[j] 值;
返回值: 返回已修改的 nums 数组

 

 

 

 

 

 

 

 

 

 

 

 

代码如下

class Solution {public int[] exchange(int[] nums) {int i = 0, j = nums.length - 1, tmp;while(i < j) {while(i < j && (nums[i] & 1) == 1) i++;while(i < j && (nums[j] & 1) == 0) j--;tmp = nums[i];nums[i] = nums[j];nums[j] = tmp;}return nums;}
}

x&1 位运算 等价于 x % 2 取余运算,即皆可用于判断数字奇偶性。 


 剑指 Offer 57. 和为 s 的两个数字

输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。

示例 1:

输入:nums = [2,7,11,15], target = 9
输出:[2,7] 或者 [7,2]
示例 2:

输入:nums = [10,26,30,31,47,60], target = 40
输出:[10,30] 或者 [30,10]

class Solution {public int[] twoSum(int[] nums, int target) {}
}

解题思路

算法流程:
初始化: 双指针 i , j 分别指向数组 nums 的左右两端 (俗称对撞双指针)。
循环搜索: 当双指针相遇时跳出;
计算和 s = nums[i] + nums[j] ;
若 s > target ,则指针 j 向左移动,即执行 j = j − 1 ;
若 s < target ,则指针 i 向右移动,即执行 i = i + 1 ;
若 s = target ,立即返回数组 [nums[i], nums[j]] ;
若循环结束,则返回空数组,代表无和为 target 的数字组合。

 

 

 

代码如下

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

剑指 Offer 58 - I. 翻转单词顺序 

输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. ",则输出"student. a am I"。

示例 1:

输入: "the sky is blue"
输出: "blue is sky the"
示例 2:

输入: "    hello world!    "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:

输入: "a good      example"
输出: "example good a"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

class Solution {public String reverseWords(String s) {}
}

解题思路

算法流程:
倒序遍历字符串 s ,记录单词左右索引边界 i , j ;
每确定一个单词的边界,则将其添加至单词列表 res ;
最终,将单词列表拼接为字符串,并返回即可。

 

 

 

 

 

 

 

 

 

代码如下

class Solution {public String reverseWords(String s) {s = s.trim();                                    // 删除首尾空格int j = s.length() - 1, i = j;StringBuilder res = new StringBuilder();while (i >= 0) {while (i >= 0 && s.charAt(i) != ' ') i--;     // 搜索首个空格res.append(s.substring(i + 1, j + 1) + " "); // 添加单词while (i >= 0 && s.charAt(i) == ' ') i--;     // 跳过单词间空格j = i;                                       // j 指向下个单词的尾字符}return res.toString().trim();                    // 转化为字符串并返回}
}

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
修复 爱普生 EPSON L4... L4151 L4153 L4156 L4158 L4163 L4165 L4166 L4168 L4...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...