代码编织梦想

目录

 题目:

分析:

编写代码:

总体的代码: 

测试结果:


 题目:

写一个函数,传入两个非降序的整数数组(A, B),将 A, B 合并成一个非降序数组 C,返回 C
(不要使用内置 sort 函数)。

分析:

1.对于给予我们的主函数,可以发现要写的函数 solution(n, m, num1, num2)返回值是一个vector<int>的容器,并且四个参数里有两个vector<string>的容器,那么首先我们是要进行容器中数据的类型转换,将string转换成int类型,方便我们后续操作;

2.组成的非降序数组C,应该要满足什么要求嘞,会需要将相同的整数合并吗?还是继承前两个数组一样,非降序那么就有可能在整个容器中全是一样的数,那么就可以了解到我最后要得到的数组应该是什么样子的;

3.知道最后要得到的容器里的数据是什么样的,那我们只需要对两个容器中的数据进行对比判断就行,c++中的容器操作是可以像数组一样,通过数组下标索引指定对应的值,不断进行对比操作小的放入新容器中,直到两个容器的下标都等于长度(循环临界值)。

int main() 

    int n;
    int m;
        std::vector<std::string> num1;
        std::vector<std::string> num2;

        std::cin>>n;
        std::cin>>m;

        std::string line_0, token_0;
        getline(std::cin >> std::ws,line_0);
        std::stringstream tokens_0(line_0);
        while(std::getline(tokens_0, token_0, ' ')){
            num1.push_back((token_0));
        }


        std::string line_1, token_1;
        getline(std::cin >> std::ws,line_1);
        std::stringstream tokens_1(line_1);
        while(std::getline(tokens_1, token_1, ' ')){
            num2.push_back((token_1));
        }


        std::vector<int> result = solution(n, m, num1, num2);


        for(auto it=result.begin();it!=result.end();++it){
            std::cout<<*it<<" ";
        }
        std::cout<<std::endl;
    
   return 0;
}

编写代码:

1.首先进行的容器内的数据转换;

通过transform函数以Tolnt表达式,进行容器中数据的转换。(改变容器中的大小写也是通过这种办法)

back_inserter()定义在头文件iterator中。接受一个指向容器的引用,返回一个与该容器绑定的插入迭代器,通过此迭代器赋值会调用push_back添加元素到容器。

int ToInt(const string &str)
{
    return atoi(str.c_str()); //将String类型转成int类型
}
std::vector<int> solution(int n, int m, vector<std::string>& num1, vector<std::string>& num2){
   std::vector<int> result;
   std::vector<int> num3;
   std::vector<int> num4;
 //transform不自动分配内存的。
  std::transform( num1.begin(), num1.end(), std::back_inserter(num3), ToInt);                       std::transform( num2.begin(), num2.end(), std::back_inserter(num4), ToInt);

2.对转换int类型的数据进行对比分析,放入 ,当时写的时候采用的暴力放入,没有啥技巧;

        首先要创建得到两个index索引值,清楚现在对比的是哪两个数,设置i索引容器num3(0<=i<n),j索引num4(0<=j<m),遍历对比数据;

(1)对于第一种情况,先开始索引的值num3[i]小于num4[j],那么就说明放入目标容器中的数应该是num3[i],直接通过push_back()函数进行放入,随后就要使i自增,因为i的循环在外层,此时的循环是j,所以得跳出当前j的循环,使用break;完成num3下一个数与num4现在的数进行比较;  极限情况:在外部的循环i以及不满足i<n了,但是j都还没有一次自增,也就是num3里的数全部比num4小怎么办? 在这个if判断里面加入一个针对索引j的循环,进入的条件就是i==(n-1),也就是num3以及全部放入了目标容器中,那么num4按顺序放入之后的目标容器即可;

if (num3[i]<num4[j])
            {
                //将num3小的放入
                result1.push_back(num3[i]);
                //如果num3很多都比num4小 将num3放进去完之后 i=n-1 最后一个时
                //将大的num4全部放入
                if (i==(n-1))
                {
                    for (;j<m;j++)
                    {
                        result1.push_back(num4[j]);
                    }
                    //break跳出循环时 j=m
                }
                break;
            }

(2) 如果num3[i]大于num4[j],那么将num4[j]放入目标容器后,利用continue直接结束后面的判断,完成j的自增,进行下一轮的对比;当然这里也会有一种极限情况:num3中的全部大于num4中的,不过不需要在这个内循环里进行操作,可以在外循环i的自增循环中在进行数据的放入;

(3)第三种情况就是num3[i]等于num4[j],那么这两个都放入,i和j都自增,去完成下两个数的对比,因为内循环是j的,通过break跳出是没有实现j自增的,所以需要在break之前完成j++;极限情况:因为这么break出j的循环后,完成i++;并要进行i<n的对比,那么如果num3的最后一个数与num4中的某一个数相等,再跳出去i++后,不满足i<n了,就会导致mun4中的某些数据没有放入,所以要应对这种情况,跟第一种方法一样;

if (num3[i]==num4[j])
            {
                //相等时 目标容器放入num3的数 同时j++,并跳出当前for 使得i也+1
                result1.push_back(num3[i]);
                result1.push_back(num4[j]);
                j++;
                //if(j==m)
                //    i++;//后面判断时还没来得及后移下一位 会导致多输出一次
                //当num3最后一个数与num4中间的数相等  num4中还有很多数据
                if (i==(n-1))
                {
                    for (;j<m;j++)
                    {
                        result1.push_back(num4[j]);
                    }
                }
                break;
            }

总体的代码: 

#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <iterator> 
#include <algorithm>
using namespace std;

int ToInt(const string &str)
{
	return atoi(str.c_str()); //将String类型转成int类型
}

std::vector<int> solution(int n, int m, std::vector<std::string>& num1, std::vector<std::string>& num2){
	std::vector<int> num3;
	std::vector<int> num4;
	//transform不自动分配内存的。
	std::transform( num1.begin(), num1.end(), std::back_inserter(num3), ToInt);
	std::transform( num2.begin(), num2.end(), std::back_inserter(num4), ToInt);
	int i=0;
	int j=0;
	std::vector<int> result1;
	for (i=0,j=0;i<n;i++)
	{
		for (;j<m;j++)
		{	
			//当前的num3小于num4
			if (num3[i]<num4[j])
			{
				//将num3小的放入
				result1.push_back(num3[i]);
				//如果num3很多都比num4小 将num3放进去完之后 i=n-1 最后一个时
				//将大的num4全部放入
				if (i==(n-1))
				{
					for (;j<m;j++)
					{
						result1.push_back(num4[j]);
					}
					//break跳出循环时 j=m
				}
				break;
			}
			//num3当前的数据比num4大 
			if (num3[i]>num4[j])
			{
				//将小的num4放入目标容器中
				result1.push_back(num4[j]);
				//继续下一个num4与现在的这个num3对比
				continue;
			}
			if (num3[i]==num4[j])
			{
				//相等时 目标容器放入num3的数 同时j++,并跳出当前for 使得i也+1
				result1.push_back(num3[i]);
				result1.push_back(num4[j]);
				j++;
				//if(j==m)
				//	i++;//后面判断时还没来得及后移下一位 会导致多输出一次
				//当num3最后一个数与num4中间的数相等  num4中还有很多数据
				if (i==(n-1))
				{
					for (;j<m;j++)
					{
						result1.push_back(num4[j]);
					}
				}
				break;
			}
		}
		//当num4里面的数全部放进目标容器
		if (j==m)
		{
			//如果num3[n-1]比num4[m-1]小 就说明前面已经全部放进去
			if (num3[n-1]<num4[m-1])
				break;
			//num3与num4最后一位是一样的 也不用再操作了
			else if (num3[n-1]==num4[m-1])
				break;
			//num3中还有多个数没有读进
			else
			{
				//num3中间的数与num4最后一个相等
				for (;i<n;i++)
				{
					result1.push_back(num3[i]);
				}
			}		
		}
	}
	return result1;
}



int main() {

	int n;
	int m;
	while(1)//加入while循环,方便后续的测试验证,就不用编译一次看一次  注意完成一次后要clear清除容器里的数据,防止数据混乱
	{
		std::vector<std::string> num1;
		std::vector<std::string> num2;

		std::cin>>n;
		std::cin>>m;

		std::string line_0, token_0;
		getline(std::cin >> std::ws,line_0);
		std::stringstream tokens_0(line_0);
		while(std::getline(tokens_0, token_0, ' ')){
			num1.push_back((token_0));
		}


		std::string line_1, token_1;
		getline(std::cin >> std::ws,line_1);
		std::stringstream tokens_1(line_1);
		while(std::getline(tokens_1, token_1, ' ')){
			num2.push_back((token_1));
		}


		std::vector<int> result = solution(n, m, num1, num2);


		for(auto it=result.begin();it!=result.end();++it){
			std::cout<<*it<<" ";
		}
		std::cout<<std::endl;
		num1.clear();
		num2.clear();
		result.clear();
	}
	

	system("pause");
	return 0;
}

测试结果:

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/icy_Long_xiao/article/details/127178958

数据结构与算法题目及c++解答_ankang0320的博客-爱代码爱编程

前言 题目主要按照类型进行整理,包括leetcode,nowcoder等网站,对于可以使用多种方法的题目,不重复列举。推荐书籍《数据结构与算法分析--C++语言描述》第四版。 本文中所有源代码及博客中其他文章的VS源代码均在github:https://github.com/AnkangH,根据名称检索即可。 1.排序算法 SortAlgorithm

Ømq中文翻译文档_我不掉头发的博客-爱代码爱编程

英语原文链接 翻译文档已上传到本人GitHub,目前只翻译了一部分,很多都是直译(英语一般==),欢迎一起来翻译~ 如果您需要转载,请注明出处。 ØMQ - The Guide [Table of Contents]

数组类编程题-爱代码爱编程

1. 二维数组查找 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。思路: 1、可以考虑对每行进行二分查找 2、以右上或左下为起点,这里选择右上,依次向左扫描,如果当前值小于target,则row++(每行最

题解 2020级HAUT新生周赛(二)-爱代码爱编程

写在读前: 本文主要面对广大c语言初学者,文中除部分特例代码采用c++书写外,大部分代码均采用c语言,大家可放心食用。题解内容包含:题目与考点分析、算法思路讲解、参考程序的代码模块设计、注意事项,在以上所有部分都讲解完成后,在一道题的最后会给出参考代码,同时部分题目兼有背景补充或拓展知识,希望可以帮助您全面深入的理解到每一个考点。在每道题的讲解部分会给出

《剑指Offer》Java实现版-电子科大-2021最新-爱代码爱编程

LeetCode-剑指offer-全 1、03数组中重复的数字 找出数组中重复的数字。 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。 示例 1:输入: [2, 3, 1, 0, 2, 5, 3] 输出:2 或

zmq 中文文档-爱代码爱编程

ØMQ - The Guide [Table of Contents](javascript:😉 By Pieter Hintjens, CEO of iMatix Please use the issue tracker for all comments and errata. This version covers the latest stab

小知识点总结(更新中)-爱代码爱编程

1: long long ans; 在运算过程中也要把对应的加数类型转换(long long),用double会损失精度。初始值比较大时赋值时末尾加上ll 例题:蓝桥杯立方和 2:1个字节:最大0111,1111 最小 1000,0000 范围是-128到127 const int MAX = ~(1 << 31); const long lo

[leetcode]第一遍+第二遍复习-爱代码爱编程

第一遍复习时间:08-04 第二遍复习时间:09-20 文章目录 58 最后一个单词的长度771 宝石和石头387 字符串中第一个唯一字符8 字符串中的整数14最长公共前缀344 反转字符串541 反转字符串2151 翻转字符串的单词242 有效的字母异位词438 找到字符串中所有字母异位词125验证回文串680 验证回文串2后面开始

LeetCode之数组-爱代码爱编程

1 找出数组中重复的数字 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。 思路:哈希 建立一个哈希表,遍历数组,如果访问到同一个哈希表的同一个位置就返回。 int findRepeatNumber(int* num

力扣算法合集-爱代码爱编程

algo 鸡汤篇排序算法二叉树哈希表栈和队列数组链表字符串算法套路 双指针排序贪心思想二分查找搜索动态规划 斐波那契数列矩阵路径数组区间分割整数最长递增子序列01背包股票交易字符串编辑算法题解动态规划剑指offer 剑指offer-数据结构剑指offer-二叉树剑指offer-动态规划剑指offer-查找和排序剑指o

LeetCode(个人记录,总结,持续更新...)-爱代码爱编程

1. 两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回答案。 示例 1: 输入:nums = [2,7,11,15], target

LeetCode Top100特训-爱代码爱编程

文章目录 两数相加盛水最多的容器电话号码的字母组合删除链表的倒数第 N 个结点字母异位词分组寻找两个正序数组的中位数合并区间不同路径(与最小路径和类似)正则表达式匹配 两数相加 链接 个人思路:将链表1转换为num1,链表2转换为num2,两数相加后再转换回链表。存在的问题:链表长度超过long long数字范围,无法做加法 题解:此题