听别人说的两道华为机试题
五月初找到了实习就不想再动了,希望还没有找到实习地方的继续加油,在暑假里好好复习,肯定好机会不会错过你们的!闲蛋就不扯了。下面的两个小程序是前天两人去华为机试的同学讲给我听的。总的来说考的都比较基础,但是一定要想全面喽
1. 写一个十七进制转10进制的方法。
涉及到输入数据合不合法。当然还有溢出问题
#include <iostream>
#include <string>
#include <ctype.h>
using std::cout;
using std::cin;
using std::string;
/*
返回值显示转换是否成功
*/
bool seventeen_2_dec(const string & str,int & result);
/*
十七制字母转换
*/
inline int seventeen_2_singdec(const char single);
int main()
{
string test;
cout<<"请输入要转换的数\n";
cin>>test;
int convter_result=0;
if (!seventeen_2_dec(test,convter_result))
{
cout<<"输入有误,无法转换\n";
}else
cout<<"结果是"<<convter_result;
system("pause");
return 0;
}
bool seventeen_2_dec(const string & str,int& result)
{
bool isSuccess=false;
bool negative=false; //指示是否是负数
int limit;
int mulimt;
int tmp;
if (str.empty() || str.length()==0)
{
return isSuccess;
}
//首先将字符串前面的0去掉
size_t start_index=0;
size_t end=str.length();
int sum=0;
if (str.at(start_index)=='-')
{
negative=true;
limit=INT_MIN;
start_index++;
}else
{
limit=-INT_MAX;
}
while(str.at(start_index)=='0')
start_index++;
if (start_index < end) {
tmp = seventeen_2_singdec(str.at(start_index++));
if (tmp < 0) {
return false;
} else {
sum = -tmp;
}
}
int multlimit=limit/17;
for (;start_index<end;start_index++)
{
tmp=seventeen_2_singdec(str.at(start_index));
if (tmp==-1)
return false;
if (sum<multlimit)
{
sum=limit;
break;
}
sum*=17;
if (sum<(limit+tmp))
{
sum=limit;
break;
}
sum-=tmp;
}
if (negative)
{
result=sum;
}else
result=-sum;
return true;
}
inline int seventeen_2_singdec(const char single)
{
int tmp=toupper(single);
if (tmp>='0' && tmp<='9')
{
return tmp-'0';
}
if (tmp>='A' && tmp<='G')
{
return 10+tmp-'A';
}
return -1;
}
2.从键盘接受一个字符串,然后将字符串中的 * 全部换成0。同时还要将转换后的字符串无用的0去掉。比如 00123变成123 00.7800900变成 0.7809也就是实数的形式
废话就不说了,就是逻辑要考虑完全,下面是java代码
import java.util.regex.Pattern;
public class MyChange {
public static void main(String[] args) {
/* ***.***
* **.09.089
* -*09730A
* 90*700000
* -89*0.**00*
*/
System.out.println(parse("-**.**"));
}
private static String parse(String input) {
// 先前过滤
if (input == null || input.trim().length() == 0)
return null;
// 首先替换
String replaced = input.replace('*', '0');
// 然后检测合法性
if (!check(replaced))
return null;
int index = replaced.indexOf('.');
// 如果是整数
if (index < 0)
return parseInteger(replaced);
else
return parseFloat(replaced);
}
// 处理整数
private static String parseFloat(String replaced) {
// 有两种情况 1. 小数点前面全是0 ,这种情况保留一个0
// 2. .小数点后面全是0 去点小数点和0
char startChar = replaced.charAt(0);
int start = 0;
String boxStart = "";
if (startChar == '-') {
start = 1;
boxStart = "-";
}
int dotIndex = replaced.indexOf('.');
// 说明至少有两个 .
if (replaced.indexOf('.', dotIndex+1) >= 0)
return null;
String left = replaced.substring(start, dotIndex);
String right = replaced.substring(dotIndex + 1);
// 对于左边的,去掉连续的0,如果全是0,保留一个
int leftIndex = 0;
int len=left.length();
while (leftIndex<len &&left.charAt(leftIndex) == '0')
++leftIndex;
if (leftIndex == left.length())
left = "0";
else
left = left.substring(leftIndex);
// 重用一下
leftIndex = right.length() - 1;
while (leftIndex>=0 &&right.charAt(leftIndex) == '0' )
--leftIndex;
if (leftIndex == -1)
right = ""; // 说明右边全是0,这样把右边置空
else
right = right.substring(0, leftIndex + 1);
if (right == ""){
if(left=="0")
return "0";
return boxStart + left;
}
else
return boxStart + left + '.' + right;
}
// 处理小数
private static String parseInteger(String replaced) {
// 消除左边连续的0
char startChar = replaced.charAt(0);
int start = 0;
String boxStart = ""; // 对于第一个字符的包装,免得后面return的时候还要判断
if (startChar == '-') {
start = 1;
boxStart = "-";
}
int len=replaced.length();
while( start<len&& replaced.charAt(start)=='0' )
++start;
// 说明全部是0
if (start == len)
return "0";
else {
return boxStart + replaced.substring(start);
}
}
// 检测合法性
private static boolean check(String input) {
return input.matches("[-]?[\\d]*[\\.]?[\\d]*");
}
}
浙公网安备 33010602011771号