《剑指Offer——57.和为s的两个数字,58.翻转单词顺序》代码
Posted 穿迷彩服的鲨鱼
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《剑指Offer——57.和为s的两个数字,58.翻转单词顺序》代码相关的知识,希望对你有一定的参考价值。
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.翻转单词顺序》代码的主要内容,如果未能解决你的问题,请参考以下文章