文章目录
- 第一关:2023 年 7 月面试题挑战
- 第二关:2023 年 6 月面试题挑战
- 第三关:2023 年 5 月面试题挑战
第一关:2023 年 7 月面试题挑战
class Solution {
public:void reverseWord(vector<char>& s,int l,int r){for(int i=l,j=r;i<=j;i++,j--){char tmp = s[i];s[i] = s[j];s[j] = tmp;}}void reverseWords(vector<char>& s) {int l = 0;for(int i=0;i<s.size();i++){if(s[i]==' ')reverseWord(s,l,i-1),l=i+1;}reverseWord(s,l,s.size()-1);reverseWord(s,0,s.size()-1);}
};
第二关:2023 年 6 月面试题挑战
遇到边界或者已经走过的点,修改方向。直至修改方向后依旧存在问题,则跳出循环♻️。
class Solution {
public:vector<int> spiralOrder(vector<vector<int>>& matrix) {int dirx[] = {0,1,0,-1};int diry[] = {1,0,-1,0};int order_dir = 0;int cols = matrix[0].size();int rows = matrix.size();bool used[rows+6][cols+6];memset(used, 0, sizeof(used));int curx = 0,cury = 0;vector<int> ans;while(!used[curx][cury]){ans.push_back(matrix[curx][cury]);used[curx][cury] = 1;int nx,ny;nx = curx + dirx[order_dir];ny = cury + diry[order_dir];if(nx<0||nx>=rows||ny<0||ny>=cols||used[nx][ny]){order_dir = (order_dir+1)%4;nx = curx + dirx[order_dir];ny = cury + diry[order_dir];if(nx<0||nx>=rows||ny<0||ny>=cols||used[nx][ny]){break;}}curx = nx;cury = ny;}return ans;}
};
class Solution {
public:bool used[30];int anslen = 0;int getcnt(){int res = 0;for(int i=0;i<=25;i++)res += used[i];return res;}bool check(string &s){int cnt[26];memset(cnt,0,sizeof(cnt));for(int i=0;i<s.length();i++){cnt[s[i]-'a']++;if(cnt[s[i]-'a']>=2) return false;}return true;}void dfs(int pos,vector<string>& arr){if(pos>=arr.size()){anslen = max(anslen,getcnt());return ;}if(!check(arr[pos])){dfs(pos+1,arr);return ;}bool flag = 0;for(int i=0;i<arr[pos].size();i++){if(used[arr[pos][i]-'a']==1){flag = 1;break;}}if(flag){dfs(pos+1,arr);return ;}for(int i=0;i<arr[pos].size();i++)used[arr[pos][i]-'a']=1;dfs(pos+1,arr);for(int i=0;i<arr[pos].size();i++)used[arr[pos][i]-'a']=0;dfs(pos+1,arr);}int maxLength(vector<string>& arr) {dfs(0,arr);return anslen;}
};
dp[i][j][k]代表处理到第i个房子,当前第i的房子偷没偷的情况为j,且第一个房子偷没偷的情况为k
class Solution {
public:int rob(vector<int>& nums) {if(nums.size()==3) return max(nums[0],max(nums[1],nums[2]));if(nums.size()==1) return nums[0];int dp[105][2][2];//dp[i][j][k]代表处理到第i个房子,当前第i的房子偷没偷的情况为j,且第一个房子偷没偷的情况为kmemset(dp,0,sizeof(dp));dp[0][0][0] = 0;dp[0][1][1] = nums[0];dp[1][1][0] = nums[1];dp[1][0][1] = nums[0];for(int i=2;i<nums.size()-1;i++){dp[i][0][0] = max(dp[i-1][0][0],dp[i-1][1][0]);dp[i][0][1] = max(dp[i-1][0][1],dp[i-1][1][1]);dp[i][1][0] = dp[i-1][0][0]+nums[i];dp[i][1][1] = dp[i-1][0][1]+nums[i];}int tot = nums.size();return max(max(dp[tot-2][1][0],dp[tot-2][1][1]),max(dp[tot-2][0][1],dp[tot-2][0][0]+nums[tot-1]));}
};
块内排序,重新组成,再排序。
class Solution {
public:struct node{int val,label;};static bool cmp(node &a,node &b){return a.val>b.val;}int largestValsFromLabels(vector<int>& values, vector<int>& labels, int numWanted, int useLimit) {int cur_id = 0;map<int,int> id;vector<node> vec[20050],fin;for(int i=0;i<labels.size();i++){if(id[labels[i]]==0) id[labels[i]] = ++cur_id;node tmp;tmp.val = values[i];tmp.label = labels[i];vec[id[labels[i]]].push_back(tmp);}node tmp;for(int i=1;i<=cur_id;i++){sort(vec[i].begin(),vec[i].end(),cmp);for(int j=0;j<min(int(vec[i].size()),useLimit);j++){tmp.val = vec[i][j].val;tmp.label = vec[i][j].label;fin.push_back(tmp);}}sort(fin.begin(),fin.end(),cmp);int ans = 0;int limit = min(numWanted,int(fin.size()));for(int i=0;i<limit;i++)ans += fin[i].val;return ans;}
};
第三关:2023 年 5 月面试题挑战
/*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {int len1 = 0;int len2 = 0;ListNode* tmp1 = l1;ListNode* tmp2 = l2;ListNode* pre;while(tmp1) len1++,tmp1 = tmp1->next;while(tmp2) len2++,tmp2 = tmp2->next;if(len2>len1){tmp1 = l1;l1 = l2;l2 = tmp1;}tmp1 = l1;tmp2 = l2;int add = 0;while(tmp1){pre = tmp1;if(tmp2){int num = tmp1->val + tmp2->val + add;tmp1->val = num%10;add = num/10;tmp1 = tmp1->next;tmp2 = tmp2->next;}else{int num = tmp1->val + add;tmp1->val = num%10;add = num/10;tmp1 = tmp1->next;}}while(add){pre->next = new ListNode();pre->next->val = add%10;pre->next->next = nullptr;pre = pre ->next;add /=10;}return l1;}
};