华为历年试题(数组8)

有一个数组a[N]如a[10]={0,1,2,3,4,5,6,7,8,9}

每隔两个数删除一个数,如0,1,2(删除),3,4,5(删除),6,7,8(删除),9,

到数组尾部回到数组头部继续删除,要求编写一个函数实现实现上述操作,

返回最后一个数的数组下标。

函数接口:int getLast(int iLen)

参数:数组初始元素个数iLen

#include<iostream>
using namespace std;

struct LinkP{
  int val;
  LinkP *next;
  LinkP(int a):val(a),next(NULL){}

};
LinkP *cycLinkP(int iLen)
{
  if(iLen<=1)
       return 0;

    LinkP *p1 = new LinkP(0);
    LinkP *h = p1;
   int i = 1;
   while(i<iLen)
   {
      LinkP *p = new LinkP(i);
      p1->next = p;
      p1 = p;
      i++;
   }
   p1->next = h;

   return h;
}
int getLast(int iLen)
{
    LinkP *h = cycLinkP(iLen);
    int num = iLen-1;
    LinkP *p = h;
    LinkP *p1 = h;
    while(num)
    {
       num--;
       p = p->next;
       p1 = p->next->next;
       p->next = p1;
       p = p1;
    }

    return p->val;

}

void main()
{
    int iLen = 2;
    cout<<getLast(iLen)<<endl;

}

如果不用上面的循环链表,而用数组的话,如下编码:

特别注意用数组做时,出现往前两步越界的问题,往往只能想到越来一次界,还有一种情况可能越两次界,所以要用while循环,直到不越界为止。

int getLast(int iLen)
{
    int i,len;
    int *s=(int *)malloc(sizeof(int)*iLen);
    for(i=0;i<iLen;i++)
        s[i]=i;
    len=iLen;

    int j=0,k;
    while(len>1)
    {
        if(j+2>=len)//防止要循环2圈的情况
        {
            j=j+2-len;
            while(j>=len)
                j -= len;
        }
        else
            j=j+2;
        for(k=j;k<len-1;k++)
        {
            s[k]=s[k+1];
        }
        len--;
    }
    return *s;
}

华为历年试题(数组8),布布扣,bubuko.com

时间: 2024-08-27 01:06:00

华为历年试题(数组8)的相关文章

华为历年试题(掷骰子游戏 7)

问题描述: 在掷骰子游戏中,会根据所掷数字在地图中前进几步,前进完成后需要根据当前地图位置所示的障碍进行相应操作,其中障碍表示: 1)  9:无障碍 2)  1:停掷一轮,即下轮所掷数字无效: 3)  2:后退两步,如果已经到起点不再后退: 4)  3:奖励前进一步 如果在游戏过程中,已经走到地图终点,则游戏结束.根据输入的地图数组,和5个骰子数的数组,返回最终玩家前进了多少步. 要求实现函数: void dice(int map_len, int* map, int* dice_val, in

华为历年试题(10约瑟夫环)

约瑟夫环形问题 有30人将其编号,从头开始1,2,3数数,每到3将其删除,一共删去15个数.输出被删去的15个数 #include<iostream> using namespace std; struct LinkList { int val; LinkList* next; LinkList(int a):val(a),next(NULL){} }; LinkList *CreatList(int n) { LinkList *p = new LinkList(1); LinkList *

华为历年试题(5)

将一个字符串的元音字母复制到另一个字符串,并排序(30分) 问题描述:有一字符串,里面可能包含英文字母(大写.小写).数字.特殊字符,现在需要实现一函数, 将此字符串中的元音字母挑选出来,存入另一个字符串中,并对字符串中的字母进行从小到大的排序 (小写的元音字母在前,大写的元音字母在后,依次有序). 说明:1.  元音字母是a,e,i,o,u,A,E,I,O,U. 2.  筛选出来的元音字母,不需要剔重:最终输出的字符串,小写元音字母排在前面,大写元音字母排在后面,依次有序. 要求实现函数:vo

华为历年试题(手机号合法性判断4)

手机号码合法性判断 问题描述:我国大陆运营商的手机号码标准格式为: 国家码+手机号码,例如:8613912345678. 特点如下:1.  长度13位: 2.  以86的国家码打头: 3.  手机号码的每一位都是数字.请实现手机号码合法性判断的函数 (注:考生无需关注手机号码的真实性, 也就是说诸如86123123456789这样的手机号码,我们也认为是合法的), 要求:1)  如果手机号码合法,返回0: 2)  如果手机号码长度不合法,返回1 3)如果手机号码中包含非数字的字符,返回2: 4)

华为历年试题(9字符串计算器)

问题描述: 在软件园开饭店的小明最近很郁闷,经常在进行账目核查时出错,每次的计算结果总是有偏差.小王知道后打算为小明解决这个问题,经过调查发现,问题出现在计算器上,当前的计算器计算方法大部分是:输入数据,输入运算符,再输入数据,立刻给出计算结果,然后不断循环.当计算结束时,如果出现偏差或者数据,无法回顾查看到底是哪一步出错,如果需要再次核查,还需要再全部输入一次,非常耽误时间.小王打算帮老板设计一种新的计算器,能够支持表达式的计算,由于是第一个版本,只需要支持整数的“+,-,*”和“( )”即可

华为历年试题(单词统计3)

单词统计 题目描述: 输入一段英文文本,用程序统计出现频率最高和最低的两个单词; 英文文本中仅出现这四类字符:空格( ).英文逗号(,).英文句号(.).英文大小写字母(a-z.A-Z) 单词之间的分隔符仅考虑这三种:空格( ).英文逗号(,).英文句号(.); 仅大小写不同的单词算同一个单词: 如果两个单词出现次数相同,则在文本中首次出现的单词优先返回. 返回的单词统一用小写字母返回 例如: 输入字符串“Hello world, i said hello world to the world”

华为历年试题(字符串1)

1.字符串问题 问题描述: 把一个字符串中的除大写字母.小写字母和数字字符之外的其他字符都去掉,输出新字符串. 要求实现函数: void my_string(char* input, char* output) [输入]  char* input,输入的字符串 [输出]  char* output, 输出的字符串 [返回]  无 示例 输入:input = “A*(BC&De+_fg/*” 输出:output = “ABCDefg” 输入:input = “aB+_9” 输出:output =

华为历年试题(字符串2)

题目描述: 输入一个字符串,将其中大写字母转换为对应小写字母之后的第五个字母, 若原始大写字母为V-Z, 则转换为对应小写字母的值减21. 其他字符不变,输出转换后的字符串. 例如,对于字母A,则转换为小写字母f:若形参是字母W,则转换为小写字母b 要求实现函数: void TransferString(const char * pInputStr, long lInputLen, char * pOutputStr); [输入] pInputStr:  输入字符串 lInputLen:  输入

华为历年真题(数组题6)

对一个数组,将数组中偶数从大到小排序,奇数从小到大排序, 奇数和偶数交叉着放且输出数组第一位放奇数,若奇数和偶数不等长,则把剩下的直接放到数组中. #include<iostream> #include<vector> #include<algorithm> using namespace std; bool cmp(int &a,int &b) { return (a>b); } void changnum(int *input,int n,in