《剑指Offer——57.和为s的两个数字,58.翻转单词顺序》代码

Posted 穿迷彩服的鲨鱼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《剑指Offer——57.和为s的两个数字,58.翻转单词顺序》代码相关的知识,希望对你有一定的参考价值。


前言

//==================================================================
// 《剑指Offer——57.和为s的两个数字,58.翻转单词顺序》代码
// 题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。
// 为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,
// 则输出"student. a am I”。
// =================================================================
// 题目:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们
// 的和正好是s。如果有多对数字的和等于s,输出任意一对即可。
//==================================================================


一、示例

1.和为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]
*/
***********************************************************************/

2.翻转单词顺序

/*********************************************************************
/*
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,
标点符号和普通字母一样处理。例如输入字符串"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"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
*/
***********************************************************************/

二、代码解析

1.新建.cpp文件

代码如下(示例):

//==================================================================
// 《剑指Offer——57.和为s的两个数字,58.翻转单词顺序》代码
// 题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。
// 为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. ",
// 则输出"student. a am I"。
// =================================================================
// 题目:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们
// 的和正好是s。如果有多对数字的和等于s,输出任意一对即可。
//==================================================================


#include <iostream>
#include<vector>
#include<stack>
using namespace std;

/*
输入一个递增排序的数组和一个数字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]
*/
/*二分法+双指针*/
vector<int> twoSum(vector<int>& nums, int target)
{
	vector<int> res;

	if (nums.empty())
	{
		return res;
	}

	int len = nums.size();
	int begin = 0, end = len - 1;

	while (begin < end)
	{
		int middle = end / 2;
		if (target <= nums[middle])
		{
			end = middle;
		}
		else
		{
			break;
		}
	}
	while (begin < end)
	{
		if (nums[begin] + nums[end] == target)
		{
			res.push_back(nums[begin]);
			res.push_back(nums[end]);
			break;
		}
		else if (nums[begin] + nums[end] < target)
		{
			begin++;
		}
		else if (nums[begin] + nums[end] > target)
		{
			end--;
		}
	}

	return res;
}

/*
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,
标点符号和普通字母一样处理。例如输入字符串"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"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
*/
/*法一-----栈+*/
string reverseWords(string s)
{
	string resStr = "";

	if (s.empty())
	{
		return "";
	}
	s += " ";

	stack<string> strStack;
	string tmpStr = "";
	for (int i = 0; i < s.length(); ++i)
	{
		if (s[i] == ' ')
		{
			if (!tmpStr.empty())
			{
				strStack.push(tmpStr);
				tmpStr.clear();
			}
		}
		else
		{
			tmpStr += s[i];
		}
	}
	s.clear();

	int size = strStack.size();
	for (int i = 0; i < size; ++i)//1 1 0 0 1
	{
		string sS = strStack.top();
		if (!sS.empty())
		{
			resStr += sS;
			
			if (i != size - 1)
			{
				resStr += " ";
			}
		}
		strStack.pop();
	}

	return resStr;
}

/*法二-----*/

int main()
{
	cout << "剑指 Offer 57. 和为s的两个数字" << endl;
	vector<int> nums = { 2,7,11,15 };
	vector<int> res = twoSum(nums, 9);
	cout << "二分法+双指针----->" << res[0] << " " << res[1] << endl << endl;

	cout << "剑指 Offer 58 - I. 翻转单词顺序" << endl;
	string s = "the sky is blue";
	cout << "法一-----栈----->"<<reverseWords(s) << endl;
	return 0;
}

三,测试

以上是关于《剑指Offer——57.和为s的两个数字,58.翻转单词顺序》代码的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

剑指 Offer 57 至 58 - II 题解

剑指 Offer 57 至 58 - II 题解

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