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


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

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

      

  • 相关阅读:
    InfoQ访谈BPEL4People代表
    传 IBM 拟 4 月 6 日宣布收购 Sun
    NetBeans 6.7 Milestone 3 Now Available for Download!
    Intel比AMD高明在哪里?
    InfoQ访谈BPEL4People代表
    Linux 3.8.1 电源管理之OMAP Voltage Domain分析
    Readline简介 Linux技术问答 Linux中国 | Linux.cn 我们的Linux中文社区
    更改日期
    JAVA研发工程师(YF)
    一键解决Ubuntu下安装Eclipse Android/C/C++ 开发环境
  • 原文地址:https://www.cnblogs.com/sandynie/p/3118750.html
Copyright © 2020-2023  润新知