华为OD机试4.26

今天早上刚刚做完华为OD的笔试题。应该是凉凉; 

第一题,喊7是一个传统的聚会游戏,N个人围成一圈,按顺时针从1到N编号。编号为1的人从1开始喊数,下一个人喊的数字为上一个人的数字加1,但是当数字是7的倍数或者数字本身含有7的话,要喊"过"。现给定一个长度为N的数组,存储了打乱顺序的每个人喊"过"的次数,请把它还原成正确的顺序,即数组的第i个元素存储编号i的人喊"过"的次数。

我用C++写的代码。但是没有过,请大佬们帮我看看问题
#include <stdio.h>
#include <math.h>
#include <sstream>
#include <iostream>
using namespace std;
 
bool isSeven(int num){
    if(0==num%7){
        return true;
    }
    while(0!=num){
        if(7==num%10){
            return true;
        }
        num/=10;
    }
    return false;
}
 
int main(){
    string s;
    while(1){
        getline(cin,s);
        if(s.empty()){
            break;
        }
        int n=0;//读取单个数值
        int count=0;//喊7次数
        int people[10]={0};//存值数组,用于存放每个人喊7的次数。
        int member = 0;//一共几个人
        istringstream sstrcin(s);
        while(sstrcin>>n){
            count+=n;
            member++;
        }
        //cout<<"member="<<member<<endl;
        //cout<<"count="<<count<<endl;
        if(0==count){
            cout<<s<<endl;
            continue;
        }
        int num =0;
        int i=1;
        while(num<count){
            if(true==isSeven(i)){
                people[i%member-1]++;
                //cout<<"people["<<i%member-1<<"]="<<people[i%member-1]<<endl;
                num++;
            }
            i++;
        }
        for(int i=0;i<member;i++){
            cout<<people[i]<<" ";
        }
        cout<<endl;
        s.clear();
    }
}

第二题,是一个关于员工工号问题
 * 创建工号,例如 a1,aa1,aa01
 * 根据人数生成工号,求工号中数字最短长度,比如a1,数字最短为1,aa01,数字最短为01,不能全为字母或者全为数字
 * x表示人数,y表示字母数
 * 输入x(0<x<2^50-1),y(0<y<=5)
 * 输入:26 1
 * 输出:1
 * 输入:260 1
 * 输出:1
 * 输入:2600 1
 * 输出:2
想来想去还是不会做。 求解这个题

第三题
模拟一个连续的内存块,其大小固定为100字节:
 - 1.用户输入"REQUEST=10"表示从内存中分配一个连续的大小为10字节的空间,当分配成功时,输出内存区块的首地址,分配失败(内存空间不足)时输出"error"
- 2.用户输入“RELEASE=0”,表示释放首地址为0所对应的区块,如果不存在相应区块,则输出“error”,反之不输出
属实不会做,随便写了写不会做。

#华为OD#
全部评论
第二题的话,比如只有一个字母,那么最多可以表示26(a-z)x10(0-9)=260个人,超过这个人数就要两位,超过26x100(0-99)=2600就要三位数字,应该就这么分析,如果有两位字母,那1位数字可以表示26x26x10个人数。我的思路差不多是这样,不知道会不会错。
5 回复 分享
发布于 2022-04-26 14:54
第二道题
2 回复 分享
发布于 2022-04-26 21:40
第一题可以想下队列栈这些数据结构,第三题可以试下模拟一个数组,初始没分配为0,然后读取命令进行分配或释放
1 回复 分享
发布于 2022-04-26 14:01
第三题  我做了一下,用并查集好做一些;分配的时候从 start =0, 找一下start的父节点。 判断1、如果父节点是自己,end = start+num-1  找下end的父节点是不是end,如果是的话。判断一下start到end之间的数,判断这些数的父节点是不是这些数本身。是的话,首地址就是start。让start到end 的父节点都为end。 返回start;  不是的话 就继续循环  start = 中间占用的最后一个地址 +1   // num为分配地址的大小 判断2、 如果父节点不是自己,就让 start= 父节点+1;  循环 释放:判断一下 如果num的 父节点为自己, 或者num<0 || num>100 , 或者 num>0  num-1的父节点和num的父节点相同  返回error;           否则  就把 num 到 num父节点之间数的父节点置为其本身。           比如  0-4, 0的父节点为4, [4,4,4,4,4]   变为 [0,1,2,3,4]  让后续分配的时候可以用 //  可能有不对的地方   逻辑大概是这个逻辑
1 回复 分享
发布于 2022-04-26 17:42
第二天就出结果了应该~楼主可以查一下~另外礼貌借个楼~。 【华为OD招聘】: 岗位:研发 / 测试 / 算法 / 大数据语言:java/web/python/c/c++/JS/go 地域:东莞、深圳、西安、武汉、成都、上海等。岗位多多,可私聊我~ 【说明】: 1、面试、绩效评定、均由华为管理层进行,满一年即有名额转正华为,转华为的要求透明,量化,达到要求即可, 2、接触并开发核心业务代码(非边缘代码!),技术栈全面,技术牛人多,技术氛围好,和互联网技术栈看齐 3、基本工资+绩效工资+年终奖+华为办公环境+带薪年假,与华为员工同工同酬,pl 无区别分配任务
1 回复 分享
发布于 2022-04-27 21:16
刚好二季度的第一题也是喊7,其实楼主思路没错,就是使用int peaple[10]有点问题,应该用std::vector<int> peaple(n,0)来代替。然后计数的时候改成peaple[(i-1)%n]即可,机试百分百通过。 ----------------------------------- 第二题思路也简单,字母总共有26个,数字每一位是10,其实就是使用最短的字母、数字组合出不同的变化。 ----------------------------------------- 第三题:嗯,这个描述的太简单了,但是看起来也不难~~
1 回复 分享
发布于 2022-05-18 14:50
第二题跟我是原题 我过了
1 回复 分享
发布于 2022-05-17 17:51
借楼,华为2012中硬OD软开,测试,算法大量HC,base 武汉东莞成都上海杭州西安等地。有意向欢迎私聊
1 回复 分享
发布于 2022-05-27 11:17
你这三道题属实有点难😅
点赞 回复 分享
发布于 2022-04-28 00:29
第一题会数组越界,需要先减一再求余
点赞 回复 分享
发布于 2022-05-06 11:48
需要华为机试题库私聊
点赞 回复 分享
发布于 2022-05-08 21:31
第二题这种类型可以只输出结果吗?毕竟测试用例应该有限
点赞 回复 分享
发布于 2022-05-30 17:33
这是我写的一个第一题的方法,但是不知道正确性 public static void solution(int[] arr) {         int totalTimes = 0;         for (int i = 0; i < arr.length; i++) {             totalTimes += arr[i];             arr[i] = 0;         }         int countTimes = 0;         for (int i = 1; i <= 300; i++) {             if (is7(i)) {                 arr[(i - 1) % arr.length]++;                 countTimes++;                 if (countTimes == totalTimes) {                     break;                 }             }         }     }
点赞 回复 分享
发布于 2022-06-17 10:57
第二题的思路,不知道对不对 public static void main(String[] args) {         Scanner sc = new Scanner(System.in);         while (sc.hasNext()) {             int x = sc.nextInt(), y = sc.nextInt();             int result = Math.max(1, (int) Math.log10(x / Math.pow(26, y)));             System.out.printf("%d\n", result);         }     }
点赞 回复 分享
发布于 2022-06-19 10:19
第三题 用字符串做的 import java.util.Scanner; /* * 模拟一个连续的内存块,其大小固定为100字节: 1.用户输入"REQUEST=10"表示从内存中分配一个连续的大小为10字节的空间,当分配成功时, 输出内存区块的首地址,分配失败(内存空间不足)时输出"error" 2.用户输入“RELEASE=0”,表示释放首地址为0所对应的区块,如果不存在相应区块,则输出“error”,反之不输出 * */ public class Test { public static void main(String[] args) { Scanner sc = new Scanner(System.in); // TODO Auto-generated method stub StringBuilder str = new StringBuilder(100); //a 空 b为头 c为体 for(int i=0;i<100;i++) { str.append('a'); } do { String input = sc.next(); if(input.equals("000")) { break; } int num = Integer.parseInt(input.substring(8)); int boo = input.substring(0, 7).equals("REQUEST")?1:0;//1代表存 0代表释放 System.out.println(Solution(num, boo, str)); for(int i=0;i<100;i++) { System.out.print(str.charAt(i)); } System.out.println(); }while(true); } public static String Solution(int num,int boo,StringBuilder str) { if(boo==1) {//分配空间 if(num==1) { int a = str.indexOf("a"); str.setCharAt(a, 'b'); return ""+a; }else { StringBuilder a = new StringBuilder("b"); StringBuilder b = new StringBuilder("a"); for(int i=0;i
点赞 回复 分享
发布于 2022-07-06 12:04

相关推荐

11-04 14:10
东南大学 Java
_可乐多加冰_:去市公司包卖卡的
点赞 评论 收藏
分享
11-11 14:21
西京学院 C++
无敌混子大王:首先一点,不管学校层次怎么样,教育经历放在第一页靠上位置,第一页看不到教育经历,hr基本直接扔掉了
点赞 评论 收藏
分享
9 88 评论
分享
牛客网
牛客企业服务