Day13 2022.11.19 双指针(简单)

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

自己实现

初步想法是一个指针从开头向右移动,移动到偶数停止;另一个指针从数组中间位置向右移动, 移动到奇数停止,然后交换,一直到left==length/2 && right==length-1。后来发现这个题目要求中的样例并不是奇数偶数个数相等,所以这个做法不行。

题解

也是双指针,不过这个做法里left是从0向右移动,right是从length-1向左移动。这个方法就能很好地解决奇数偶数个数不相等的问题了。

代码如下:

class Solution {
public:
	vector<int> exchange(vector<int>& nums) {
		if (nums.size() < 2)return nums;
		int length = nums.size();
		int left = 0;
		int right = length - 1;
		while (left < right)
		{
			while (left < length && nums[left] % 2 == 1)
				left++;
			while (right>=0 && nums[right] % 2 == 0)
				right--;
			if (left >= length)return nums;
			if (right < 0)return nums;
			if (left<right && nums[left] % 2 == 0 && nums[right] % 2 == 1)
			{
				int tmp = nums[left];
				nums[left] = nums[right];
				nums[right] = tmp;
			}
			left++;
			right--;
		}
		return nums;
	}
};

代码表现

hint:

  • 感觉对从后往前的遍历不太容易想到,可以强化一下

57.和为s的两个数字

自己实现

left从开始往后走,right从尾开始往前走。如果nums[left]+nums[right]<targetleft++;如果nums[left]+nums[right]>targetright--;如果==则代表符合结果。但感觉这样的做法对于有些样例会有错误。

代码如下:

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        vector<int> res;
        int length=nums.size();
        int left=0;
        int right=length-1;
        while(left<right)
        {
            if(nums[left]+nums[right]<target)left++;
            else if(nums[left]+nums[right]>target)right--;
            else 
            {
                res.push_back(nums[left]);
                res.push_back(nums[right]);
                return res;
            }
        }
        return res;
    }
};

代码表现

题解

证明了自己实现当中的顾虑是不存在的

hint:

  • 双指针放在左右两端称为对撞双指针

58-Ⅰ.翻转单词顺序

自己实现

这个就是用输入流读入的方式循环读入,自动根据空格分割好,然后直接调用reverse(vec.begin(),vec.end())来逆序,并输出就好

代码如下:

class Solution {
public:
    string reverseWords(string s) {
        istringstream in(s);
        vector<string> vec;
        string str;
        int flag=0;
        while(in>>str)
        {
            flag=1;
            vec.push_back(str);
        }
        if(!flag)return "";
        reverse(vec.begin(),vec.end());
        string res=vec[0];
        for(int i=1;i<vec.size();i++)res+=" "+vec[i];
        return res;
    }
};

代码表现

hint:

  • vector的逆序方法:reverse(vec.begin(),vec.end())。这个并不是vector的内置方法,而是将vector的迭代器作为参数

  • c++按照空格分割字符串的两个方法

    • 使用strtokchar *strtok(string s, char *delim)分解字符串为一组字符串,s为要分解的字符串,delim为分隔符字符串。这个函数会将s中的delim设置为'\0'

      注意:在第一次调用时,strtok()必须给予函数s字符串,往后的调用则将参数s设置成NULL。每次调用成功则返回指向被分割出片段的指针。

      string str = "hhh ttt ggg jjj";
      //方法一: strtok
      char* s = new char[str.size() + 1];
      strcpy(s, str.c_str());
      char* p = strtok(s, " ");
      vector<string> words;
      while(p) {
      	words.push_back(p);
      	p = strtok(NULL, " ");
      }
      
    • 使用istringstream:是一个类,使用构造函数istringstream s(str)将字符串绑定成流(stream,和cin等效)。这样就可以用s>>tmp这样的方法来自动按照空格分割了。

      string str = "hhh ttt ggg jjj";
      //方法二: istringstream
      istringstream ss(str);
      vector<string> words;
      string word;
      while(ss >> word) {
      	words.push_back(word);
      }
      
  • string类转成char *类用str.c_str()方法

原文地址:http://www.cnblogs.com/cspzyy/p/16913857.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性