大疆嵌入式软件编程题==找鞍点

1.1、已知循环缓冲区是一个可以无限循环读写的缓冲区,当缓冲区满了还继续写的话就会覆盖我们还没读取到的数据。下面定义了一个循环缓冲区并初始化,请编写它的Write函数:

#include <iostream>
#include <stdlib.h>
#include <memory.h>
#include <string.h>
using namespace  std;
typedef struct Ringbuf{
    char * Buf;
    unsigned int Size;
    unsigned int RdId;
    unsigned int WrId;
}Ringbuf;
void Init(Ringbuf* ringBuf,char *buf,unsigned int size)
{
   memset(ringBuf,0,sizeof(Ringbuf));
   ringBuf->Size=size;
   ringBuf->Buf=buf;
   ringBuf->RdId=0;
   ringBuf->WrId=0;

}
int rb_data_size(Ringbuf* rb)
{
    return (rb->WrId-rb->RdId)&(rb->Size-1);
}
int rb_free_size(Ringbuf* rb)
{
    return(rb->Size-1-rb_data_size(rb));
}
void write(Ringbuf* ringBuf,char * buf,unsigned int strlen)
{
    unsigned int pos=ringBuf->WrId;//记录我们写指针的偏移
    while(pos+strlen>ringBuf->Size){//判断我们写的字节数是否大于整个buffer长度
        memcpy(ringBuf->Buf+pos,buf,ringBuf->Size-pos);//将我们的内容直接拷贝到偏移位置
        buf +=(ringBuf->Size-pos); //获取要拷贝的buf地址
        strlen -=ringBuf->Size-pos;  //计算多出来的长度
        pos=0;
    }
    memcpy(ringBuf->Buf+pos,buf,strlen);//将多出来的长度的内容搬到基址开始,从我们的buf中继续写过来,实现循环
    ringBuf->WrId=pos+strlen; //移动我们的写指针
}
void display(Ringbuf* ringbuf)
{
    for(int i=0;i<ringbuf->Size;i++){
        cout<<ringbuf->Buf[i];
    }
    cout<<endl;
}
int main()
{
   Ringbuf *rb=(Ringbuf*)malloc(sizeof(Ringbuf));
   char init_str[16]=" ";
   int size=sizeof(init_str);
   Init(rb,init_str,size);
   char p[]="1234567";
   write(rb,p,8);
   display(rb);
   return 0;
}

 具体参考:

https://www.freesion.com/article/16821075305/

2、N X N数组,输出行中最小,列中最大的数的位置,比如:

1 2 3
4 5 6
7 8 9

输出:row=2,col=0

#include  <iostream>
#include  <vector>
#include  <unordered_map>
#include  <algorithm>
using namespace  std;
typedef  pair<int,int>  PAIR;
int n;
bool cmp_by_value(const PAIR& a,const PAIR& b){
    return  a.second<b.second;
}
struct Axis{
   int x;
   int y;
};
int flag=0;
Axis  Findpoint(vector<vector<int> >& arr)
{
  int row=arr.size();
  int col=arr[0].size();
  int i;
  int j;

  int i_min;
  int j_max;
  Axis axis;
  for(i=0;i<row;i++){
      i_min=arr[i][0];
      for(j=0;j<col;j++){
        if(arr[i][j]<i_min){
            i_min=arr[i][j];
        }
      }
      for(j=0;j<col;j++){
          j_max=arr[0][j];
         for(int k=0;k<col;k++){
             if(j_max<arr[k][j]){
                 j_max=arr[k][j];
             }
         }
         if(arr[i][j]==i_min){
             if(arr[i][j]==j_max){
                 flag=1;
                 axis.x=i;
                 axis.y=j;
                 return axis;
             }
         }
      }
  }
  if(flag==0){
      cout<<"NONE"<<endl;
  }
}
int main()
{
    int n;
    cin>>n;
    vector<vector<int> > vec(n,vector<int>(n));
    Axis axis;
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            cin>>vec[i][j];
        }
    }
    axis=Findpoint(vec);
    if(flag){
    cout<<axis.x<<" "<<axis.y<<endl;
    }

    return 0;
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值