首页 > 其他分享 >剑指offer——Day13 双指针(简单)

剑指offer——Day13 双指针(简单)

时间:2022-11-22 00:12:02浏览次数:43  
标签:right offer nums vector vec str Day13 指针 left

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()方法

标签:right,offer,nums,vector,vec,str,Day13,指针,left
From: https://www.cnblogs.com/cspzyy/p/16913857.html

相关文章

  • 剑指offer——Day11 2022.11.17 双指针(简单)
    Day112022.11.17双指针(简单)18.删除链表的节点自己实现直接遍历就行了代码如下:classSolution{public:ListNode*deleteNode(ListNode*head,intval){......
  • VS2019 error C4703: 使用了可能未初始化的本地指针变量 "xx"
    在编译VS的时候,遇到这错误,根据参考资料,在”项目属性“-“C/C++”-“常规”-“SDL检查”,将其改为否。(参考资料提到的另一个方法是将指针声明时初始化为nullptr)另外,......
  • 数组与指针总结
    一.前言在复习C语言和写实验的过程中对于指针数组模块做出的一些初学者的总结与看法。二.指针简介1.从根本来看,指针是一个值为内存地址的变量。可编写如下程......
  • 老男孩教育 | 已婚已育,30岁转行做网安,三个月收获满意Offer!
    不够优秀,努力来凑~~~不要为懒散和懈怠找任何理由,每天给自己一个希望,路是靠自己走出来的,成功是靠自己努力得到的!!!俗话说:二十而冠,三十而立!30岁是人生分水岭,步......
  • 函数指针数组
    /* Function:函数指针数组*/#include<stdio.h>#include<stdlib.h>intfunc1(intn){printf("func1:%d\n",n);returnn;}intfunc2(intn){......
  • 调用函数指针
    /* DesignModel:设计模式 Function:使用函数指针列表搭建程序框架*/#include<stdio.h>#include<stdlib.h>inthello(inti);voidhey(inti);intsomeother(vo......
  • [力扣] 剑指 Offer 第四天 - 0~n-1中缺失的数字
    耐心和持久胜过激烈和狂热。题目来源来源:力扣(LeetCode)链接:​​https://leetcode.cn/problems/que-shi-de-shu-zi-lcof​​著作权归领扣网络所有。商业转载请联系官方授权,......
  • 指针
    指针是什么在计算机科学中,指针(pointer)是编程语言的一个对象,利用地址,它的值直接指向(pointsto)存在电脑存储器中的另一个地方的值.由于通过地址能够找所需的的变量单元。......
  • 指针的基础知识(上)
    大家晚上好呀,今天要给大家带来的是关于指针的基础知识点。首先,我们都知道如何一个整型的变量,并赋值给它。如:inti=5;但它在电脑中具体的运行是怎么样的呢?其实啊,首先在电脑内......
  • 【c&c++】二级指针的使用
    有时候,我们需要在函数体的内部申请内存空间并初始化,然后将内部申请的存储空间交付给外部指针来引用,这时候,我们可以使用二级指针作为申请空间的函数的参数来实现。main.c......