听别人说的两道华为机试题

      五月初找到了实习就不想再动了,希望还没有找到实习地方的继续加油,在暑假里好好复习,肯定好机会不会错过你们的!闲蛋就不扯了。下面的两个小程序是前天两人去华为机试的同学讲给我听的。总的来说考的都比较基础,但是一定要想全面喽

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]*");
	}

}

  

posted on 2013-06-05 13:19  SandyNie  阅读(269)  评论(0编辑  收藏  举报

导航