2018年华为实习生招聘三道编程题

第一题:给定一个字符串,输出字符串中连续最长的数字串,并把这个最长数字串的长度输出来,中间以逗号(,)隔开。如果存在长度一样的的连续数字串,返回最后一个连续数字串。

样例:abcd12345ed125ss123058789

output:   123058789,9

分析:新建两个StringBuffer,一个是用来存储目前连续数字的字符串,另一个用来存储最长的连续数字字符串,不断比较更新。

java代码如下:

/*
 寻找字符串的最长数字子串
 */
import java.util.Scanner;
import java.util.ArrayList;
public class Huawei1{
public static void main(String[] args) {
    Scanner in =new Scanner(System.in);
    while(in.hasNext()){
       String str = in.nextLine();
        ArrayList<Integer> list = new ArrayList<Integer>();
        int now ;
        int max =0;
        StringBuffer maxNumBuffer= new StringBuffer();
        StringBuffer nowNumBuffer= null;
        for(int i=0;i<str.length();i++)
        {
            now = 0;
            nowNumBuffer = new StringBuffer();
            //判断该字符是不是数字
            while (i<str.length() && str.charAt(i)>=48 && str.charAt(i)<=57)
            {
                nowNumBuffer.append(String.valueOf(str.charAt(i)));
                now++;
                i++;
            }
            if(now>0) list.add(now);
            if(now>0 && now>=max){
                maxNumBuffer = nowNumBuffer;
                max = now;
            }
        }
            System.out.println(maxNumBuffer+","+maxNumBuffer.length());


    }
}

}

第二题如下图:



我自己用的java没有完全AC,然后借用别人的C++代码是可以完全做到的。有时间我再改。先贴出来,大家一起讨论。

/*
 * 根据数值占用BIT数,按顺序从输入字节流中解析出对应数值,解析顺序按输入数组astElement索引
 * 升序,比如输入
 * 3  //代表接下来输入三个数字
 * OX62 OX80 OX00  //0110 0010  1000 0000 0000 0000
 * 2 //接下来解析出两个数,就是输出两个数
 * 4 // 前面四位,所以第一个输出为4
 * 5  //之后的五位,所以输出为00101 所以输出为6
 * 输出为 6
 * 5
 * C++代码:
 * #include <vector>
#include <string>
#include <iostream>


using namespace std;
int main() {
  int num; cin >> num;
  vector<long long> nums(num);
  for(int i=0; i < num; ++i) {
    cin >> hex >> nums[i];
  }


  int time; cin >> time;
  vector<int> times(time);
  for(int i=0; i < time; ++i) {
    cin >> dec >> times[i];
  }


  vector<bool> bits;
  for(int num: nums) {
    for(int i=0x80; i; i>>=1) {
      bits.push_back(num&i);
    }
  }


  int start = 0;
  long long result = 0;
  for(int time: times) {
    for(int i=0; i<time; ++i) {
      result = 2*result + bits[i+start];
    }
    cout << result << endl;


    result = 0;
    start += time;
  }


  return 0;
}


 */
import java.util.Scanner;


    public class Huawei2 {
        public static void main(String[] args){
            Scanner sc = new Scanner(System.in);
            while(sc.hasNext()){
                int uiIutputLen = Integer.parseInt(sc.nextLine());
                String[] numStrings = sc.nextLine().split(" ");
                StringBuilder sb = new StringBuilder();
                for(int i=0;i<uiIutputLen;i++){
                    int num = (char)Integer.parseInt(numStrings[i].substring(2), 16);
                    int mask = 0x80;
                    while(mask>0){
                        if((num & mask)==mask){
                            sb.append("1");
                        }else {
                            sb.append("0");
                        }
                        mask>>=1;
                    }
                }


                int uiElementNum = Integer.parseInt(sc.nextLine());
                int start = 0;
                for(int i = 0; i<uiElementNum;i++){
                    int uiElementLength = Integer.parseInt(sc.nextLine());




                        System.out.println(Integer.parseInt(sb.substring(start, start+uiElementLength), 2));
                        start += uiElementLength;


                }
            }


        }


}



第三题是一个大整数相乘的形式:

/*
 * 整数相乘,大整数
 * (-12341234)*(43214321)
 * output:-533318047612114
 */
import java.util.Scanner;
public class Huawei3{
    public static void main(String[] args) {
        Scanner in =new Scanner(System.in);
        while(in.hasNext()){
            String st1=in.nextLine();
            String st2=in.nextLine();


            String a  =null;
            String b =null;
            boolean flag = true;
            if(st1.charAt(0)=='-'){
                flag = !flag;
                a = st1.substring(1);
            }
           
            else {
                a = st1;
            }
            if(st2.charAt(0)=='-'){
                flag = !flag;
                b = st2.substring(1);
            }else {
                b = st2;
            }


            String out = multiply(a, b);


            if(flag){
                System.out.println(out);
            }else {
                System.out.println("-"+out);
            }
        }
    }
    public static String multiply(String num1, String num2) {
        int l = num1.length();
        int r = num2.length();
        //用来存储结果的数组,可以肯定的是两数相乘的结果的长度,肯定不会大于两个数各自长度的和。
        int[] num = new int[l+r];
        //第一个数按位循环
        for(int i=0;i<l;i++) {
            //得到最低位的数字
            int n1=num1.charAt(l-1-i)-'0';
            //保存进位
            int tmp=0;
            //第二个数按位循环
            for(int j=0;j<r;j++) {
                int n2=num2.charAt(r-1-j)-'0';
                //拿出此时的结果数组里存的数+现在计算的结果数+上一个进位数
                tmp=tmp+num[i+j]+n1*n2;
                //得到此时结果位的值
                num[i+j]=tmp%10;
                //此时的进位
                tmp/=10;
            }
            //第一轮结束后,如果有进位,将其放入到更高位
            num[i+r]=tmp;
        }


        int i=l+r-1;
        //计算最终结果值到底是几位数,
        while(i>0&&num[i]==0){
            i--;
        }
        StringBuilder result=new StringBuilder("");
        //将数组结果反过来放,符合正常读的顺序,
        //数组保存的是:1 2 3 4 5
        //但其表达的是54321,五万四千三百二十一。
        while(i>=0) {
            result.append(num[i--]);
        }
        String result2=result.toString();


        return result2;
    }

}


网上可以找到题目,我的代码也稍微注释了,欢迎讨论!


  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值