1.华为面试题一
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
class Solution {
public:
string reverseWords(string s) {
reverse(s.begin(), s.end());
int left = 0;
int i = 0;
for (; i < s.size(); i++)
{
if (s[i] == ' ')
{
reverse(s.begin() + left, s.begin() + i );
left = i +1;
}
}
if (left <= i - 1)
{
reverse(s.begin() + left, s.begin() + i);
}
cout << s << endl;
return s;
}
};
5 leetcode
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
using namespace std;
#define MAX(a,b) ((a)>(b)?(a):(b))
class Solution {
public:
string longestPalindrome(string s) {
if (s.size() == 0)
return "";
if (s.size() == 1)
return s;
int n = s.size();
int max = 1;
int leftmax = 0;
for (int i = 0; i < n; i++)
{
int j = i + 1;
int r = i-1;
while (j < n&&r >= 0 && s[r] == s[j]) //奇数
{
int t=MAX(max, j - r + 1);
if (max <t)
leftmax = r;
max = t;
r--;
j++;
}
j = i+1;
r = i;
while (j < n&&r >= 0 && s[r] == s[j] ) //偶数
{
int t = MAX(max, j - r + 1);
if (max <t)
leftmax = r;
max = t;
r--;
j++;
}
}
cout << s.substr(leftmax, max) << endl;
return s.substr(leftmax, max);
}
};
6
class Solution {
public:
string convert(string s, int numRows) {
if(numRows==1) return s;
int n=s.size();
vector<string> vec(min(n,numRows));
bool bflag=false;
int row=0;
for(int i=0;i<n;i++)
{
vec[row]+=s[i];
if(row==0 || row==numRows-1)
bflag=!bflag;
if(bflag)
row++;
else
{
row--;
}
}
string res;
for(string t:vec)
{
res+=t;
}
return res;
}
};
7.
class Solution {
public:
int reverse(int x) {
long res=0;
while(x!=0)
{
res=res*10+x%10;
x=x/10;
}
return res>2147483647||res<-2147483648?0:res;
}
};
8.
int myAtoi(string str) {
int n=str.size();
int i=0;
for(;i<n;i++)
{
if(str[i]!=' ')
break;
}
int b=1;
int j=i;
long res=0;
if(str[i]=='-')
{
j++;
b=-1;
}
if(str[i]=='+')
{
j++;
b=1;
}
for(;j<n;j++)
{
if(str[j]>='0'&&str[j]<='9')
{
res=res*10+str[j]-'0';
if((b*res)>2147483647)
{
res=2147483647;
break;
}
if((b*res)<-2147483648)
{
res=-2147483648;
break;
}
}
else
{
break;
}
}
res*=b;
cout<<res<<endl;
return res;
}
9.
bool isPalindrome(int x) {
if(x<0)
return false;
long rx=0,num=x;
while(num!=0)
{
rx=rx*10+num%10;
num=num/10;
}
if(x==rx)
return true;
else
{
return false;
}
}
10.
// //正则表达式匹配
// bool isMatch(const string& s,const string& p)
// {
// return doMatch(s, 0, p, 0);
// }
// // 考察s串从sIndex开始的子串与模式串p中从pIndex开始的子串是否匹配(均包括开始位置直到末尾)。
// bool doMatch(const string& s, int sIndex, const string& p, int pIndex)
// {
// if (pIndex >= p.size()) return sIndex >= s.size(); //p索引大于p长度,str到末尾则表示匹配成功,否则失败
// bool currentMatch = sIndex < s.size() && (s[sIndex] == p[pIndex] || p[pIndex] == '.');
// if(pIndex + 1 < p.size() && p[pIndex + 1] == '*')
// {
// // *匹配0个字符(无论当前字符匹不匹配这都有可能s = abbc, p = ab*bbc) || 当前字符匹配并尝试s中的下一个字符
// return doMatch(s, sIndex, p, pIndex + 2) || (currentMatch && doMatch(s, sIndex + 1, p, pIndex));
// }
// else // 没有*
// {
// // 正常匹配,包括了.
// // 匹配上就考察下一个,否则 return false
// return currentMatch && doMatch(s, sIndex + 1, p, pIndex + 1);
// }
// }
11.
int maxArea(vector<int>& height)
{
//双指针法移动
int len=height.size();
int max=0;
int j=len-1;
for(int i=0;i<j;)
{
max=MAXTF(MINTF(height[i],height[j])*j-i,max);
if(height[i]<height[j])
{
i++;
}
else
{
j--;
}
}
return max;
}
12.
string intToRoman(int num)
{
if(num<1||num>3999)
return "";
vector<int> store={1000,900,500,400,100,90,50,40,10,9,5,4,1};
vector<string> str={"M","CM","D","CD","C","XC","L","XL","X","IX","V","IV","I"};
string res;
int size=store.size();
for(int i=0;i<size;i++)
{
while(num>=store[i])
{
res.append(str[i]);
num-=store[i];
}
}
return res;
}
13.
int romanToInt(string s)
{
map<char,int> s_v=
{
make_pair('M',1000),make_pair('D',500),make_pair('C',100),make_pair('L',50),
make_pair('X',10),make_pair('V',5),make_pair('I',1)
};
if(s.size()==0)
return 0;
s+="I";
int res=0;
int i=0;
for(;i<s.size()-1;i++)
{
if(s_v[s[i]]>=s_v[s[i+1]])
res+=s_v[s[i]];
else res-=s_v[s[i]];
}
return res;
}
14.
string longestCommonPrefix(vector<string>& strs)
{
if(strs.size()==0) return "";
if(strs.size()==1) return strs[0];
string res="";
for(int i=0;i<strs[0].size();i++)
{
for(int j=1;j<strs.size();j++)
{
if(strs[0][i]!=strs[j][i])
{
return res;
}
}
res.push_back(strs[0][i]);
}
return res;
}
15.
vector<vector<int>> threeSum(vector<int>& nums)
{
sort(nums.begin(),nums.end());
vector<vector<int>> res;
if(nums.size()<3) return res;
int len=nums.size();
int l=1,r=len-1;
for(int i=0;i<nums.size()-2;i++)
{
l=i+1;
r=len-1;
if(nums[i]>0||nums.size()<3) break;
if(i>0&&nums[i]==nums[i-1]) continue;
while(l<r)
{
if((nums[i]+nums[l]+nums[r])==0)
{
vector<int> t={nums[i],nums[l],nums[r]};
res.push_back(t);
l++;
}
else if(r+1<nums.size()&&nums[r]==nums[r+1]||(nums[i]+nums[l]+nums[r])>0)
r--;
else if(l>i&&nums[l]==nums[l-1]||(nums[i]+nums[l]+nums[r])<0)
l++;
}
}
return res;
}
16.
int threeSumClosest(vector<int>& nums, int target) {
sort(nums.begin(), nums.end());
if (nums.size() < 3) {
int res = 0;
for (int i = 0; i < nums.size(); i++) {
res += nums[i];
}
return res;
}
int isum = nums[0] + nums[1] + nums[2];
for (int i = 0; i < nums.size(); i++) {
int left = i + 1, right = nums.size() - 1;
while (left < right) {
int csum = nums[i] + nums[left] + nums[right];
if (abs(csum - target) < abs(isum - target))
isum = csum;
if (csum < target)
left++;
else if (csum > target)
right--;
else
return target;
}
}
return isum;
}
17
map<char,string> mapc={
{'2',"abc"},
{'3',"def"},
{'4',"ghi"},
{'5',"jkl"},
{'6',"mno"},
{'7',"pqrs"},
{'8',"tuv"},
{'9',"wxyz"}
} ;
vector<string> res;
string s;
void dnf(int index ,string digits)
{
if(index==digits.size())
{
res.push_back(s);
return ;
}
for(int i=0;i<mapc[digits[index]].size();i++) //按键对应的字母
{
s.push_back(mapc[digits[index]][i]);
dnf(index+1,digits);
s.pop_back();
}
}
vector<string> letterCombinations(string digits)
{
if(digits.size()==0)
return res;
dnf(0,digits);
return res;
}
18
vector<vector<int>> fourSum(vector<int>& nums, int target) {
vector<vector<int>> res;
if(nums.size()<4)
return res;
sort(nums.begin(),nums.end());
int size=nums.size();
for(int i=0;i<nums.size()-3;i++)
{
if(nums[i]+nums[i+1]+nums[i+2]+nums[i+3]>target) break;
if(nums[i]+nums[size-1]+nums[size-2]+nums[size-3]<target) continue;
if(i>0 && nums[i]==nums[i-1]) continue;
for(int j=i+1;j<size-2;j++)
{
if(nums[i]+nums[j]+nums[j+1]+nums[j+2] >target) break;
if(nums[i]+nums[j]+nums[size-1]+nums[size-2]<target) continue;
if(j>i+1 && nums[j]==nums[j-1]) continue;
int left=j+1,right=size-1;
while(left<right)
{
if((nums[i]+nums[j]+nums[left]+nums[right])==target)
{
vector<int> tv={nums[i],nums[j],nums[left],nums[right]};
res.push_back(tv);
int tleft=left,tright=right;
while(left<right && nums[tleft]==nums[left]) left++;
while(left<right && nums[tright]==nums[right]) right--;
}
if((nums[i]+nums[j]+nums[left]+nums[right])<target)
left++;
else if((nums[i]+nums[j]+nums[left]+nums[right])>target)
right--;
}
}
}
return res;
}
19
ListNode* removeNthFromEnd(ListNode* head, int n) {
vector<ListNode *> nodeVec;
if(head==NULL)
return head;
ListNode * p=head;
while(p)
{
nodeVec.push_back(p);
p=p->next;
}
if(n==nodeVec.size())
return head->next;
nodeVec[nodeVec.size()-n-1]->next=nodeVec[nodeVec.size()-n]->next;
delete nodeVec[nodeVec.size()-n];
nodeVec[nodeVec.size()-n]=NULL;
return head;
}
20
bool isValid(string s) {
bool b = false;
stack<char> ls;
ls.push(' ');
map<char, char> mapcc = {
{ '(', ')' },
{ '[', ']' },
{ '{', '}' },
{ ' ', ' ' },
};
for (int i = 0; i < s.size(); i++)
{
if (mapcc[ls.top()] == s[i])
{
ls.pop();
}
else
{
ls.push(s[i]);
}
}
return ls.size() > 1 ? false : true;
}
21
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode *p=NULL,*phead=new ListNode(-1);
p=phead;
while(l1!=NULL && l2 !=NULL)
{
if(l1->val > l2->val)
{
p->next=l2;
l2=l2->next;
}
else{
p->next=l1;
l1=l1->next;
}
p=p->next;
}
p->next= (l1==NULL)? l2: l1;
return phead->next;
}
22
回溯法
vector<string> generateParenthesis(int n) {
vector<string> res;
dfs(res,"",0,0,n);
return res;
}
void dfs(vector<string> &res,string cur,int l,int r,int n)
{
if(r>l||l>n||r>n) return ;
if(l==n && r==n)
{
res.push_back(cur);
return ;
}
dfs(res,cur+"(",l+1,r,n);
dfs(res,cur+")",l,r+1,n);
}
23
ListNode* mergetwoList(ListNode *l1,ListNode *l2)
{
if(l1==NULL) return l2;
if( l2==NULL) return l1;
if(l1->val > l2->val)
{
l2->next=mergetwoList(l1,l2->next);
return l2;
}
else{
l1->next=mergetwoList(l1->next,l2);
return l1;
}
}
ListNode* mergeKLists(vector<ListNode*>& lists) {
if(lists.size()==0) return NULL;
ListNode *phead=lists[0];
for(int i=1;i<lists.size();i++)
{
phead=mergetwoList(phead,lists[i]);
}
return phead;
}
24.
ListNode *swapPairs(ListNode *head)
{
if(head==NULL|| head->next ==NULL) return head;
ListNode *node=head->next;
head->next=swapPairs(head->next->next);
node->next=head;
return node;
}
26
int removeDuplicates(vector<int>& nums) {
int res=0,t=0;
int size=nums.size();
nums.push_back(1);
for(int i=0;i<size;i++)
{
nums[t]=nums[i];
t++;
while(nums[i]==nums[i+1]&& i+1<size) i++ ;
}
return t;
}
27.
int removeElement(vector<int>& nums, int val) {
int i=0,j=0;
for(;j<nums.size();j++)
{
if(nums[j]!=val)
{
nums[i++]=nums[j];
}
}
return i;
}
42.
int trap(vector<int>& height)
{
int left=0;
int len=height.size();
if(len==0) return 0;
int cur=height[0],res=0;
int m=max_element(height.begin(),height.end())-height.begin();
for(int i=1;i<m;i++)
{
if(height[i]>=cur)
{
cur=height[i];
}
else
{
res+=(cur-height[i]);
}
}
cur=height[len-1];
for(int j=len-2;j>m;j--)
{
if(height[j]>=cur)
cur=height[j];
else
{
res+=(cur-height[j]);
}
}
return res;
}