输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. ",则输出"student. a am I"。输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。思路先把整个字符串反转,然后挨个单词反转,再处理空格。代码class Solution { public: void reverse(string& s,int left,int right) { while(left < right) { char tmp = s[left]; s[left] = s[right]; s[right] = tmp; left++; right--; } } string reverseWords(string s) { i

输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。思路:定义两个数front,rear。front表示序列的末尾,rear表示序列的开端。初时front=2,rea=1。这是一个不断变化的序列。计算这个序列的和,如果等于target,则找到一个答案,因为可能还有其他答案,所以此时,front加一。如果大于target,rear加一。如果小于target,front加一。代码:class Solution { public: vector<vector<int>> findContinuousSequence(int target) { int front = 2,rear = 1; vector<vector<int>> ans; while(rear < front) { int sum = (front+rear)*(front-rear+1)/

输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。思路:因为是递增排序数组,所以可以定义两个下标,一左一右,左边指向开端,右边指向末尾。看这两个下标指向的数之和跟target进行比较,如果相等,则找到了。如果大于target,右边下标减一。如果小于target,左边下标加一。代码:class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { int len = nums.size(); int left = 0,right = len-1; while(left<right) { int sum = nums[left]+nums[right]; if(sum == target) { return {nums[left],nums[right]};

在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。思路按位统计,如果某一位的余数不为0,则这一位必属于只出现一次的数。代码class Solution { public: int singleNumber(vector<int>& nums) { int bytes = sizeof(int); int totalBit = bytes*8; vector<int> bitArr(totalBit); for(int num: nums) { for(int i = 0;i < totalBit;i++) { bitArr[i] += (num & (1 << i))>0?1:0; } } int ans = 0; for(int i = 0;i < totalBit;i

一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。思路整个数组的的数组异或结果就是那两个只出现一次的两个数的异或结果。记这个结果为sum,只出现一次的两个数分别为x,y。如果sum的某一二进制位为1,记为sumi,说明x,y的相应二进制位不同,以这个二进制位为标准划分数组,和sumi相同的划到一组,不同的划到另一组。那么x,y不同组,并且x组里其他数字必是俩俩相同的,y组里也一样。代码class Solution { public: vector<int> singleNumbers(vector<int>& nums) { int sum = 0; for(int num: nums) { sum ^= num; } int dif = 1; while((sum&dif) == 0) { dif = dif &l