华为oj 迭代器
来源:互联网 发布:万师傅家具安装软件 编辑:程序博客网 时间:2024/05/22 15:05
#ifndef SLICE_ITERATOR_H#define SLICE_ITERATOR_H#include <stdlib.h>#define MAX_COORD_NUM 10typedef 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 - 10return -1;for(int i =0 ;i < slice_desc->coord_num;i++)if(slice_desc->coord_spec[i] < 0 )//维度下标最大值不能小于0return -1;for(int i =0;i < slice_desc->coord_num;i++)if(slice_desc->coord_slice[i].start < 0 || slice_desc->coord_slice[i].end > slice_desc->coord_spec[i]|| slice_desc->coord_slice[i].start > slice_desc->coord_slice[i].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[i] = slice_desc->coord_slice[i];slice_iterator->curr[i] = slice_desc->coord_slice[i].start;}for(int i =0;i < slice_desc->coord_num;i++){slice_iterator->size[i] = 1;for(int j = i+1;j < slice_desc->coord_num;j++)slice_iterator->size[i] *= (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[i] * slice_iterator->curr[i];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[i] > slice_iterator->coord_slice[i].end){slice_iterator->curr[i-1] ++;slice_iterator->curr[i] = slice_iterator->coord_slice[i].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;elsereturn 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 - 10return -1;for(int i =0 ;i < slice_desc->coord_num;i++)if(slice_desc->coord_spec[i] < 0 )//维度下标最大值不能小于0return -1;for(int i =0;i < slice_desc->coord_num;i++)if(slice_desc->coord_slice[i].start < 0 || slice_desc->coord_slice[i].end > slice_desc->coord_spec[i]|| slice_desc->coord_slice[i].start > slice_desc->coord_slice[i].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[i] = slice_desc->coord_slice[i].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;}
0 0
- 华为oj 迭代器
- 华为OJ
- 华为oj:
- 华为OJ 对象管理器
- 华为OJ一个题目
- 华为OJ 最高分是多少
- 华为OJ 约瑟夫问题
- 华为OJ Home+work
- 【华为oj】求最小公倍数
- 华为OJ:字符串反转
- 华为OJ:数字颠倒
- 华为OJ ----合法IP
- 【华为OJ】逆波兰
- 华为OJ:DNA序列
- 【华为OJ】电话号码
- 华为OJ:汽水瓶
- 华为OJ:分段排序
- 华为oj-合法IP
- 初次使用RecycleView报错,Multiple dex files define Landroid/support/annotation/AnimRes;
- iOS并发编程
- Android M 新的运行时权限开发者需要知道的一切
- C声明阅读
- UML类图关系
- 华为oj 迭代器
- iTextSharp简单用法
- CAMediaTimingFunction相关
- CodeForces 248B Chilly Willy
- 深入探索透视投影变换
- iOS面试题纪录
- Maven + Spring 简单示例
- processor register
- 单个变量打印九九乘法表