第一题:给定一个字符串,输出字符串中连续最长的数字串,并把这个最长数字串的长度输出来,中间以逗号(,)隔开。如果存在长度一样的的连续数字串,返回最后一个连续数字串。
样例: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;
}
}
网上可以找到题目,我的代码也稍微注释了,欢迎讨论!