• 菜鸡的秋招升级打怪之旅


    记录秋招。。。

    旷视一面(2022.08.12)

    • softmax,交叉熵loss实现

    softmax=\frac{e^{z_i}}{\sum_{j=1}^Ce^{z_j}}

    L_{CE}=\frac{1}{N}\sum_{i=1}^{N}-log(\frac{e^{z_i}}{\sum_{j=1}^Ce^{z_j}})

    1. import numpy as np
    2. import torch
    3. import torch.nn.functional as F
    4. def softmax(logits):
    5. logits_exp = torch.exp(logits)
    6. logits_softmax = logits_exp / torch.sum(logits_exp, dim=1, keepdims=True)
    7. return logits_softmax
    8. def cross_entropy(logits_softmax, label):
    9. log_res = torch.log(logits_softmax)
    10. one_hot = torch.zeros_like(logits_softmax)
    11. one_hot.scatter_(1,label.view(-1, 1),1)
    12. loss = -torch.sum(log_res*one_hot, dim=1).mean()
    13. return loss
    14. # softmax
    15. logits=torch.randn([2,5]) # B x C
    16. label=torch.tensor([0,3])
    17. logits_softmax=softmax(logits)
    18. print(logits_softmax)
    19. print(F.softmax(logits,dim=1)) # 验证
    20. # 预测的值
    21. y_pred = torch.argmax(logits_softmax, dim=1)
    22. print(y_pred)
    23. # cross_entropy
    24. print(cross_entropy(logits_softmax, label))
    25. print(F.cross_entropy(logits, label))
    26. '''
    27. 输出
    28. tensor([[0.1391, 0.1638, 0.0294, 0.4314, 0.2363],
    29. [0.2304, 0.2246, 0.3404, 0.0679, 0.1367]])
    30. tensor([[0.1391, 0.1638, 0.0294, 0.4314, 0.2363],
    31. [0.2304, 0.2246, 0.3404, 0.0679, 0.1367]])
    32. tensor([3, 2])
    33. tensor(2.3307)
    34. tensor(2.3307)
    35. '''
    • 【补充】计算IOU
    1. def compute_iou(box1, box2):
    2. '''
    3. box 0,1,2,3: x1,y1,x2,y2
    4. '''
    5. area1 = (box1[2]-box1[0]) * (box1[3]-box1[1])
    6. area2 = (box2[2]-box2[0]) * (box2[3]-box2[1])
    7. area_sum = area1 + area2
    8. x1=max(box1[0], box2[0])
    9. y1=max(box1[1], box2[1])
    10. x2=min(box1[2], box2[2])
    11. y2=min(box1[3], box2[3])
    12. if x1 >= x2 or y1 >= y2:
    13. return 0
    14. area_jiao = (x2-x1) * (y2-y1)
    15. print(area_sum, area_jiao)
    16. iou = area_jiao / (area_sum - area_jiao)
    17. return iou
    18. box1=torch.tensor([1,3,4,5]).float()
    19. box2=torch.tensor([3,4,6,8]).float()
    20. print(compute_iou(box1, box2))
    21. '''
    22. 输出
    23. tensor(18.) tensor(1.)
    24. tensor(0.0588)
    25. '''
    • 【补充】计算NMS
    1. def NMS(boxes, scores, thresh=0.03):
    2. sorted_scores, idx = torch.sort(scores, descending=True)
    3. sorted_boxes = boxes[idx]
    4. result_boxes = []
    5. while len(sorted_boxes) > 1:
    6. box=sorted_boxes[0]
    7. result_boxes.append(box)
    8. sorted_boxes = sorted_boxes[1:]
    9. saved_idx = []
    10. for i, item in enumerate(sorted_boxes):
    11. if(compute_iou(box, item)<thresh):
    12. saved_idx.append(i)
    13. sorted_boxes = sorted_boxes[saved_idx]
    14. if len(sorted_boxes)> 0:
    15. result_boxes.append(sorted_boxes[0])
    16. return result_boxes
    17. box0 = torch.tensor([100,100,200,200]).float()
    18. box1=torch.tensor([1,3,4,5]).float()
    19. box2=torch.tensor([3,4,6,8]).float()
    20. scores = torch.tensor([0.5, 0.8, 0.9])
    21. boxes = []
    22. boxes.append(box0)
    23. boxes.append(box1)
    24. boxes.append(box2)
    25. boxes = torch.cat(boxes, dim=0).reshape(3,-1)
    26. NMS(boxes, scores)
    27. '''
    28. 输出
    29. [tensor([3., 4., 6., 8.]), tensor([100., 100., 200., 200.])]
    30. '''

    2. 反转链表

    1. #include<bits/stdc++.h>
    2. using namespace std;
    3. typedef long long ll;
    4. typedef pair<int,int> P;
    5. const int N=505;
    6. struct ListNode{
    7. int val;
    8. ListNode *next;
    9. ListNode(int x): val(x), next(NULL) {}
    10. };
    11. void print(ListNode *p){
    12. if(p!=NULL){
    13. printf("%d ", p->val);
    14. print(p->next);
    15. }
    16. }
    17. ListNode *reverse_list(ListNode *root){
    18. ListNode *pre=NULL;
    19. ListNode *cur=root;
    20. while(cur!=NULL){
    21. ListNode *nex=cur->next;
    22. cur->next=pre;
    23. pre=cur;
    24. cur=nex;
    25. }
    26. return pre;
    27. }
    28. int main(){
    29. int n,a;
    30. scanf("%d",&n);
    31. ListNode *head=new ListNode(-1);
    32. ListNode *p=head;
    33. for(int i=0;i<n;i++){
    34. scanf("%d",&a);
    35. ListNode *now=new ListNode(a);
    36. p->next=now;
    37. p=p->next;
    38. }
    39. print(head->next);
    40. ListNode *rev_head=reverse_list(head->next);
    41. printf("\n");
    42. print(rev_head);
    43. }

    旷视二面(2022.08.12)

    • 长尾识别中Decoupling方法为什么有效
    • 人脸loss中为什么||W||=1了,但是head classes权重的模长还是较长
    • 大数定律。。。

    挂。。。

    快手一面(2022.08.18)

    1. class Solution {
    2. public:
    3. int dp[2505];
    4. int lengthOfLIS(vector<int>& nums) {
    5. int n=nums.size();
    6. dp[0]=1;
    7. int ans=dp[0];
    8. for(int i=1;i
    9. dp[i]=1;
    10. for(int j=0;j
    11. if(nums[j]
    12. dp[i]=max(dp[i], dp[j]+1);
    13. }
    14. }
    15. ans=max(dp[i], ans);
    16. }
    17. return ans;
    18. }
    19. };

    快手二面(2022.09.13)

    问项目问的很详细,第1道题最小k个数,我先讲的思路:单边快排(O(n))、优先队列(O(nlogk))、插入排序(O(nk)),这三个思路面试官都说让我别着急写,然后给我出了第2题。。。此时我还以为我第一题所有思路不对。。。就直接开始写第2题了。。。大怨种说的是我吧。。。后续又提问了知识点和场景题,面了大概1.5h,累虚脱了。。。

    1. class Solution {
    2. public:
    3. int Partition(vector<int>&arr, int b, int e){
    4. if(b>=e)return b;
    5. int x=arr[b];
    6. int i=b,j=e+1;
    7. while(1){
    8. while(arr[++i]
    9. while(arr[--j]>x);
    10. if(i>=j)break;
    11. swap(arr[i], arr[j]);
    12. }
    13. arr[b]=arr[j];
    14. arr[j]=x;
    15. return j;
    16. }
    17. void quick_sort(vector<int>&arr, int b, int e, int k){
    18. if(b>=e)return ;
    19. int pos=Partition(arr, b, e);
    20. if(k<=pos){
    21. quick_sort(arr, b, pos-1, k);
    22. }
    23. else{
    24. quick_sort(arr, b, pos-1, k);
    25. quick_sort(arr, pos+1, e, k);
    26. }
    27. }
    28. vector<int> smallestK(vector<int>& arr, int k) {
    29. vector<int>ans;
    30. if(arr.size()==0)return ans;
    31. if(k==0)return ans;
    32. quick_sort(arr, 0, arr.size()-1, k-1);
    33. for(int i=0;i
    34. ans.push_back(arr[i]);
    35. }
    36. return ans;
    37. }
    38. };
    • 最长公共子序列的值

    这里开个数组记录状态路径,然后回推回去返回最长公共子序列的值

    1. class Solution {
    2. public:
    3. int longestCommonSubsequence(string text1, string text2) {
    4. int n=text1.length();
    5. int m=text2.length();
    6. int dp[n+1][m+1];
    7. memset(dp, 0, sizeof(dp));
    8. int pre[n+1][m+1];
    9. for(int i=1;i<=n;i++){
    10. for(int j=1;j<=m;j++){
    11. if(text1[i-1]==text2[j-1]){
    12. dp[i][j]=dp[i-1][j-1]+1;
    13. pre[i][j]=1;
    14. }
    15. else{
    16. dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
    17. if(dp[i][j]==dp[i-1][j]){
    18. pre[i][j]=2;
    19. }
    20. else{
    21. pre[i][j]=3;
    22. }
    23. }
    24. }
    25. }
    26. int i=n,j=m;
    27. string ans="";
    28. while(i>=1&&j>=1){
    29. if(text1[i-1]==text2[j-1]){
    30. string t;
    31. t.push_back(text1[i-1]);
    32. ans=t+ans;
    33. }
    34. if(pre[i][j]==1){
    35. i--;
    36. j--;
    37. }
    38. else if(pre[i][j]==2){
    39. i--;
    40. }
    41. else j--;
    42. }
    43. cout<
    44. return dp[n][m];
    45. }
    46. };

    超参数一面

    方法一:优先队列,把链表的每个元素看出单个元素送到优先队列中 

    1. /**
    2. * Definition for singly-linked list.
    3. * struct ListNode {
    4. * int val;
    5. * ListNode *next;
    6. * ListNode() : val(0), next(nullptr) {}
    7. * ListNode(int x) : val(x), next(nullptr) {}
    8. * ListNode(int x, ListNode *next) : val(x), next(next) {}
    9. * };
    10. */
    11. class Solution {
    12. public:
    13. struct cmp{
    14. bool operator()(ListNode *a, ListNode *b){
    15. return a->val > b->val;
    16. }
    17. };
    18. ListNode* mergeKLists(vector& lists) {
    19. priority_queue, cmp>pq;
    20. int n=lists.size();
    21. for(int i=0;i
    22. if(lists[i])pq.push(lists[i]);
    23. }
    24. ListNode *res=new ListNode(-1);
    25. ListNode *p=res;
    26. while(!pq.empty()){
    27. ListNode *tmp=pq.top();
    28. pq.pop();
    29. p->next=tmp;
    30. p=p->next;
    31. if(tmp->next){
    32. pq.push(tmp->next);
    33. }
    34. }
    35. return res->next;
    36. }
    37. };

    方法二:归并排序

    1. /**
    2. * Definition for singly-linked list.
    3. * struct ListNode {
    4. * int val;
    5. * ListNode *next;
    6. * ListNode() : val(0), next(nullptr) {}
    7. * ListNode(int x) : val(x), next(nullptr) {}
    8. * ListNode(int x, ListNode *next) : val(x), next(next) {}
    9. * };
    10. */
    11. class Solution {
    12. public:
    13. ListNode* Merge(ListNode *left, ListNode *right){
    14. if(left==NULL)return right;
    15. if(right==NULL)return left;
    16. ListNode *ans=new ListNode(-1);
    17. ListNode *p=ans;
    18. while(left&&right){
    19. if(left->val<=right->val){
    20. p->next=left;
    21. left=left->next;
    22. }
    23. else{
    24. p->next=right;
    25. right=right->next;
    26. }
    27. p=p->next;
    28. }
    29. if(left)p->next=left;
    30. if(right)p->next=right;
    31. return ans->next;
    32. }
    33. ListNode* merge_sort(vectorlists, int b, int e){
    34. if(b==e)return lists[b];
    35. if(b>e)return NULL;
    36. int m=(b+e)/2;
    37. ListNode *left=merge_sort(lists, b, m);
    38. ListNode *right=merge_sort(lists, m+1, e);
    39. return Merge(left, right);
    40. }
    41. ListNode* mergeKLists(vector& lists) {
    42. return merge_sort(lists, 0, lists.size()-1);
    43. }
    44. };
    1. class Solution {
    2. public:
    3. unordered_map<char,int>pos;
    4. int lengthOfLongestSubstring(string s) {
    5. int n=s.length();
    6. int left=0;
    7. int ans=0;
    8. for(int i=0;i
    9. if(pos[s[i]]-1>=left){//交叉重复
    10. ans=max(ans, i-left);
    11. left=pos[s[i]];
    12. }
    13. pos[s[i]]=i+1;
    14. }
    15. ans=max(ans, n-left);
    16. return ans;
    17. }
    18. };

     超参数二面

     

    •  调用randint4(随机生成0-3),构造randint5(随机生成0-4),要求等概率

    面试官的提示:5个人掷骰子决定谁去拿快递,那么掷到1-5就对应的人去,掷到6就再来一次

    那么,这里可以看成调用2次randint4函数分别得到x,y,那么4x+y的范围是0-15(其实也就是x有4种,4x+y可以构造成等概率即两两不相等的16种)

    由于16种结果是等概率的,我们只要前15种,如果是最后1种的话,就再来一次。

    则调用randint4中rand函数的期望是:2*(1+1/16+1/16^2+1/16^3...)=2*(1+1/15)

    此处感谢瓜佬的思路。。。

    挂。。。

    1. #include
    2. using namespace std;
    3. typedef long long ll;
    4. typedef pair<int,int> P;
    5. const int N=100005;
    6. const ll mod=1e9+7;
    7. int randint4(){
    8. return rand()%4;
    9. }
    10. int randint5(){
    11. int x=randint4();
    12. int y=randint4();
    13. int sum=4*x+y;
    14. if(sum+1!=16){
    15. return (sum+1)%5;
    16. }
    17. else{
    18. return randint5();
    19. }
    20. }
    21. int main(){
    22. for(int i=1;i<=10;i++){
    23. cout<<randint5()<
    24. }
    25. }

    阿里一面(2022.09.14)

    • 大数加法
    1. #include
    2. using namespace std;
    3. typedef long long ll;
    4. typedef pair<int,int> P;
    5. const int INF=0x3f3f3f3f;
    6. const int N=3005;
    7. int n,cnt=0;
    8. void add(string s1, string s2, int flag){
    9. int n=s1.length();
    10. int m=s2.length();
    11. int len=max(n,m);
    12. int nums[len+5];
    13. memset(nums,0,sizeof(nums));
    14. for(int i=0;i
    15. int a=s1[i]-'0';
    16. int b=s2[i]-'0';
    17. nums[i]+=(a+b);
    18. nums[i+1]+=nums[i]/10;
    19. nums[i]%=10;
    20. }
    21. int k;
    22. if(nums[len]!=0){
    23. k=len;
    24. }
    25. else k=len-1;
    26. if(flag)printf("-");
    27. for(int i=k;i>=0;i--){
    28. printf("%d",nums[i]);
    29. }
    30. printf("\n");
    31. }
    32. void sub_solve(string s1, string s2){
    33. int len=s1.length();
    34. reverse(s1.begin(),s1.end());
    35. reverse(s2.begin(),s2.end());
    36. int nums[len+1];
    37. memset(nums,0,sizeof(nums));
    38. for(int i=0;i
    39. int a=s1[i]-'0';
    40. int b;
    41. if(ilength()){
    42. b=s2[i]-'0';
    43. }
    44. else{
    45. b=0;
    46. }
    47. if(a>=b){
    48. nums[i]+=a-b;
    49. }
    50. else{
    51. nums[i]=10+a-b;
    52. nums[i+1]--;
    53. }
    54. }
    55. for(int i=len-1;i>=0;i--){
    56. if(nums[i]==0)len--;
    57. else break;
    58. }
    59. for(int i=len-1;i>=0;i--){
    60. printf("%d",nums[i]);
    61. }
    62. printf("\n");
    63. }
    64. void sub(string s1, string s2){//s1-s2
    65. int len1=s1.length();
    66. int len2=s2.length();
    67. int flag=0;
    68. if(len1>len2){
    69. flag=1;
    70. }
    71. else if(len1
    72. flag=2;
    73. }
    74. else{
    75. for(int i=0;i
    76. if(s1[i]>s2[i]){
    77. flag=1;
    78. break;
    79. }
    80. else if(s1[i]
    81. flag=2;
    82. break;
    83. }
    84. }
    85. }
    86. if(flag==0){
    87. printf("0\n");
    88. }
    89. else if(flag==1){
    90. sub_solve(s1,s2);
    91. }
    92. else{
    93. printf("-");
    94. sub_solve(s2,s1);
    95. }
    96. }
    97. int main(){
    98. string s1,s2;
    99. cin>>s1>>s2;
    100. if(s1[0]!='-'&&s2[0]!='-'){
    101. reverse(s1.begin(),s1.end());
    102. reverse(s2.begin(),s2.end());
    103. add(s1,s2,0);
    104. }
    105. else if(s1[0]=='-'&&s2[0]=='-'){
    106. s1=s1.substr(1);
    107. s2=s2.substr(1);
    108. reverse(s1.begin(),s1.end());
    109. reverse(s2.begin(),s2.end());
    110. add(s1,s2,1);
    111. }
    112. else{
    113. if(s1[0]=='-'){
    114. s1=s1.substr(1);
    115. sub(s2,s1);
    116. }
    117. else{
    118. s2=s2.substr(1);
    119. sub(s1,s2);
    120. }
    121. }
    122. }
    • 一道leetcode题,字符+数字,字符重复数字的,问第k个字符是什么,暴力模拟即可

    阿里二面(2022.09.16)

    电话面试,没考算法,方向不匹配,面完就挂了

    微软一面(2022.09.19) 

    面试官小哥哥真的是我面过的最有礼貌最谦虚的,夸夸

    剑指 Offer II 119. 最长连续序列

    需要考虑出现重复的情况 

    1. class Solution {
    2. public:
    3. int longestConsecutive(vector<int>& nums) {
    4. int n=nums.size();
    5. if(n==0||n==1)return n;
    6. sort(nums.begin(), nums.end());
    7. int left=0,cnt=1,maxx=1;
    8. for(int i=1;i
    9. if(nums[i]==nums[i-1])continue;
    10. if(nums[i]-1==nums[i-1]){
    11. cnt++;
    12. }
    13. else{
    14. if(maxx
    15. maxx=cnt;
    16. left=i-cnt;
    17. }
    18. cnt=1;
    19. }
    20. }
    21. if(cnt>maxx){
    22. maxx=cnt;
    23. left=n-cnt;
    24. }
    25. return maxx;
    26. }
    27. };

  • 相关阅读:
    Docker镜像多架构构建
    09-排序3 Insertion or Heap Sort(浙大数据结构)
    38.CSS文本动画效果
    Vue组合式 api 的常用知识点
    人工智能基础_机器学习039_sigmoid函数_逻辑回归_逻辑斯蒂回归_分类神器_代码实现逻辑回归图---人工智能工作笔记0079
    MySQL(4)
    PyTorch 卷积网络正则化 DropBlock
    学生信息管理系统 图形用户界面(GUI) java 实现对数据库的操作 数据库用的mysql
    MakeSense中文版使用手册【图像标注神器】
    C++ Reference: Standard C++ Library reference: Containers: array: array: rend
  • 原文地址:https://blog.csdn.net/m0_37579232/article/details/126306501