设为首页 收藏本站
查看: 922|回复: 0

[经验分享] 华为练习 迭代器

[复制链接]

尚未签到

发表于 2016-6-6 08:09:58 | 显示全部楼层 |阅读模式
  

  

#ifndef SLICE_ITERATOR_H
#define SLICE_ITERATOR_H
#include <stdlib.h>
#define MAX_COORD_NUM 10
typedef struct
{
unsigned long start;//起始下标
unsigned long end; //结束下标
}CoordSlice;
typedef struct
{
int* first_element_of_orignal_array;//原始数组的第一个元素指针
unsigned long coord_num; //维度个数,最大取值为MAX_COORD_NUM,值为10
//原始数组从左到右各维度下标属性表示如下(从0到coord_num-1):
unsigned long coord_spec[MAX_COORD_NUM];//原始数组每个维度下标的最大取值
CoordSlice coord_slice[MAX_COORD_NUM];//切片在每个维度上的起止下标
}SliceDesc;
typedef struct
{
//结构内容由考生自行设计定义
int* first_element_of_orignal_array;//原始数组的第一个元素指针
unsigned long coord_num; //维度个数,最大取值为MAX_COORD_NUM,值为10
//原始数组从左到右各维度下标属性表示如下(从0到coord_num-1):
CoordSlice coord_slice[MAX_COORD_NUM];//切片在每个维度上的起止下标
unsigned long size[MAX_COORD_NUM];//每一维度下面填满后的大小。
unsigned long curr[MAX_COORD_NUM];//指针所对应的每一维度的下标
}SliceIterator;
int SliceIteratorInit (const SliceDesc* slice_desc, SliceIterator* slice_iterator);
int* SliceIteratorGetCurr(const SliceIterator* slice_iterator);
void SliceIteratorNext(SliceIterator* slice_iterator);
int SliceIteratorEnd(const SliceIterator* slice_iterator);
int CopySlice (const SliceDesc* slice_desc,int** first_element_of_slice_array,unsigned long* slice_element_num);
#endif



  

  

#include "SliceIterator.h"
/******************************************************************************
功能:初始化一个切片迭代器,使其指向切片内的第一个元素
输入:
slice_desc    : 切片描述符指针(合法性由考生检查)
slice_iterator: 切片迭代器指针
输出:
slice_iterator: 初始化后的切片迭代器的指针
返回:
0:成功,-1:失败
说明:
1)SliceIterator结构需要由考生自行设计和定义
2)迭代器内存由调用者申请,大小仅为sizeof(SliceIterator),函数内部不得额外申请动态内存
3)用例保证其他接口的输入不会是未初始化过的迭代器指针
******************************************************************************/
int SliceIteratorInit (const SliceDesc* slice_desc, SliceIterator* slice_iterator)
{
/* 在这里实现功能 */
//检测切片描述指针是否正确。
if(slice_desc == 0)//不为空
return -1;
if(slice_desc->coord_num < 1 || slice_desc->coord_num > 10)//coord_num在1 - 10
return -1;
for(int i =0 ;i < slice_desc->coord_num;i++)
if(slice_desc->coord_spec < 0 )//维度下标最大值不能小于0
return -1;
for(int i =0;i < slice_desc->coord_num;i++)
if(slice_desc->coord_slice.start < 0 || slice_desc->coord_slice.end > slice_desc->coord_spec|| slice_desc->coord_slice.start > slice_desc->coord_slice.end)//检测。。。
return -1;
slice_iterator->first_element_of_orignal_array = slice_desc->first_element_of_orignal_array;
slice_iterator->coord_num = slice_desc->coord_num;
for(int i = 0;i < slice_desc->coord_num;i++){
slice_iterator->coord_slice = slice_desc->coord_slice;
slice_iterator->curr = slice_desc->coord_slice.start;
}
for(int i =0;i < slice_desc->coord_num;i++){
slice_iterator->size = 1;
for(int j = i+1;j < slice_desc->coord_num;j++)
slice_iterator->size *= (slice_desc->coord_spec[j]+1) ;
}
return 0;
}
/******************************************************************************
功能:获取当前元素指针
输入:
slice_iterator:迭代器指针
输出:无
返回:指向当前元素的指针。若迭代结束,应返回空指针。
******************************************************************************/
int* SliceIteratorGetCurr(const SliceIterator* slice_iterator)
{
/* 在这里实现功能 */
if(SliceIteratorEnd(slice_iterator))
return 0;
else{
int i, t = 0;
for(i = slice_iterator->coord_num-1; i > -1;i--)//unsigned真是坑。。。。
t += slice_iterator->size * slice_iterator->curr;
return &slice_iterator->first_element_of_orignal_array[t];
}
return 0;
}
/******************************************************************************
功能:移动到下一个元素
输入:
slice_iterator  迭代器指针
输出:
slice_iterator  更新后的迭代器
返回:无
******************************************************************************/
void SliceIteratorNext(SliceIterator* slice_iterator)
{
/* 在这里实现功能 */
slice_iterator->curr[slice_iterator->coord_num-1] ++;
for(int i = slice_iterator->coord_num-1; i > 0;i--)
if(slice_iterator->curr > slice_iterator->coord_slice.end){
slice_iterator->curr[i-1] ++;
slice_iterator->curr = slice_iterator->coord_slice.start;
}
return;
}
/******************************************************************************
功能:迭代是否结束
输入:
slice_iterator:   迭代器指针
输出:无
返回:1: 迭代已结束; 0:迭代未结束
******************************************************************************/
int SliceIteratorEnd(const SliceIterator* slice_iterator)
{
/* 在这里实现功能 */
if(slice_iterator->curr[0] > slice_iterator->coord_slice[0].end)
return 1;
else
return 0;
}
/******************************************************************************
功能:创建一个数组切片的拷贝
输入:slice_desc:  切片描述符指针(合法性由考生检查)
输出:
first_element_of_slice_array:新的切片数组的第一个元素指针
slice_element_num:新的切片数组中元素个数
返回:0:成功,-1:失败
说明:first_element_of_slice_array内存在函数内申请,调用者释放
******************************************************************************/
int CopySlice(const SliceDesc* slice_desc,int** first_element_of_slice_array, unsigned long* slice_element_num)
{
/* 在这里实现功能 */
//检测切片描述指针是否正确。
if(slice_desc == 0)//不为空
return -1;
if(slice_desc->coord_num < 1 || slice_desc->coord_num > 10)//coord_num在1 - 10
return -1;
for(int i =0 ;i < slice_desc->coord_num;i++)
if(slice_desc->coord_spec < 0 )//维度下标最大值不能小于0
return -1;
for(int i =0;i < slice_desc->coord_num;i++)
if(slice_desc->coord_slice.start < 0 || slice_desc->coord_slice.end > slice_desc->coord_spec|| slice_desc->coord_slice.start > slice_desc->coord_slice.end)//检测。。。
return -1;
SliceIterator si;
SliceIteratorInit(slice_desc,&si);
int i = 0;
while(SliceIteratorEnd(&si) != 1){
i++;
SliceIteratorNext(&si);
}
*slice_element_num = i;
*first_element_of_slice_array = (int*)malloc(sizeof(int)*i);
int *q = *first_element_of_slice_array;
for(i = 0;i < slice_desc->coord_num;i++){
si.curr = slice_desc->coord_slice.start;
}
while(SliceIteratorEnd(&si) != 1){
**first_element_of_slice_array= *SliceIteratorGetCurr(&si);
(*first_element_of_slice_array)++;
SliceIteratorNext(&si);
}
*first_element_of_slice_array = q;
return 0;
}


又开始做华为上的题目了,总算做对第二道题目了。  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-226800-1-1.html 上篇帖子: 人生第一次华为面试 下篇帖子: 文思创新 外包华为android
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表