按奇偶排序数组一类题解法

x33g5p2x  于2021-12-21 转载在 其他  
字(2.6k)|赞(0)|评价(0)|浏览(227)

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

对应letecode链接:剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 - 力扣(LeetCode) (leetcode-cn.com)

题目描述:

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

示例:

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

提示:

0 <= nums.length <= 50000
0 <= nums[i] <= 10000

解题思路:双指针

1.定义头指针 left ,尾指针 right .
2.left 一直往右移,直到它指向的值为偶数
3.right 一直往左移, 直到它指向的值为奇数
4.交换 nums[left]和 nums[right]重复上述操作,直到 left == right。

对应动图:

按奇偶排序数组II

对应letecode链接:
https://leetcode-cn.com/problems/sort-array-by-parity-ii/

题目描述:

给定一个非负整数数组 A, A 中一半整数是奇数,一半整数是偶数。

对数组进行排序,以便当 A[i] 为奇数时,i 也是奇数;当 A[i] 为偶数时, i 也是偶数。

你可以返回任何满足上述条件的数组作为答案。

示例:

输入:[4,2,5,7]
输出:[4,5,2,7]
解释:[4,7,2,5],[2,5,4,7],[2,7,4,5] 也会被接受。

提示:

2 <= A.length <= 20000
A.length % 2 == 0
0 <= A[i] <= 1000

解题思路:双指针

定义两个数组下标(也可以说是指针)i 和 j ,其中 i = 0, j = 1,用于遍历这个数组;

当下标 i(偶数) 对应的数组元素值为奇数时,停止遍历 i 转向遍历 j;

当下标 j (奇数) 对应的数组元素值为偶数时,停止遍历 j;

交换这两个下标对应的数组元素的值,继续遍历重复步骤1、2,直到下标 i 或 j 超出数组边界停止

以数组 {4, 2, 5, 7} 为栗子,看在原数组中怎么通过查找并交换数组元素得到符合题目要求的数组的。

当 i = 0 时,A[i] = 4 (偶数),继续遍历,此时 i 来到下标为 2 的位置,此时 A[i] = 5 (奇数),停止遍历 

此时转向遍历 j,由于 A[j] = 2 (偶数),停止遍历,交换 A[i] 和 A[j] 

交换后:

对应代码:

class Solution {
public:
    vector<int> sortArrayByParityII(vector<int>& nums) {
                  int i=0;
                  int j=1;
                  int n=nums.size();
                  while(i<n&&j<n){

                      while(i<n&&nums[i]%2==0){//偶数位置对应偶数如果出现了奇数就停下来
                          i+=2;
                      }
                      while(j<n&&nums[j]%2==1){//奇数
                          j+=2;
                      }
                      if(i<n&&j<n){//判断是否越界
                          swap(nums[i],nums[j]);//交换
                      }
                  }
                  return nums;
    }
};

代码二:

class Solution {
public:
    vector<int> sortArrayByParityII(vector<int>& nums) {
                  vector<int>ans;
                  ans.resize(nums.size());
                  int i=0;
                  int j=1;
                  for(auto x:nums){
                    if(x%2==0){偶数对应偶数位置
                        ans[i]=x;
                        i+=2;
                    }else{//奇数对应奇数位置
                        ans[j]=x;
                        j+=2;
                    }
                  }
                  return ans;
    }
};

交替合并字符串

对应letecode链接: 
1768. 交替合并字符串 - 力扣(LeetCode) (leetcode-cn.com)

题目描述:

给你两个字符串 word1 和 word2 。请你从 word1 开始,通过交替添加字母来合并字符串。如果一个字符串比另一个字符串长,就将多出来的字母追加到合并后字符串的末尾。

返回 合并后的字符串 。

示例 1:

输入:word1 = "abc", word2 = "pqr"
输出:"apbqcr"
解释:字符串合并情况如下所示:
word1:  a   b   c
word2:    p   q   r
合并后:  a p b q c r
示例 2:

输入:word1 = "ab", word2 = "pqrs"
输出:"apbqrs"
解释:注意,word2 比 word1 长,"rs" 需要追加到合并后字符串的末尾。
word1:  a   b 
word2:    p   q   r   s
合并后:  a p b q   r   s
示例 3:

输入:word1 = "abcd", word2 = "pq"
输出:"apbqcd"
解释:注意,word1 比 word2 长,"cd" 需要追加到合并后字符串的末尾。
word1:  a   b   c   d
word2:    p   q 
合并后:  a p b q c   d

提示:

1 <= word1.length, word2.length <= 100
word1 和 word2 由小写英文字母组成 

解题思路和上面的相似:

对应代码: 

class Solution {
public:
    string mergeAlternately(string word1, string word2) {
            int len=min(word1.size(),word2.size());//获取最短的长度
            string ans;
            for(int  i=0;i<len;i++){
                ans+=word1[i];
                ans+=word2[i];
            }

           if(word1.size()==word2.size()){
               return ans;
           }else if(word1.size()==len){
               return ans+=word2.substr(len,word2.size()-len);//获取字串
           }else{
               return ans+=word1.substr(len,word1.size()-len);
           }
    }
};

相关文章

微信公众号

最新文章

更多