看大神文章小结——微软等面试 20,21

大神 地址 :http://blog.csdn.net/v_JULY_v/article/details/6015165

第 20 题(字符串):
题目:输入一个表示整数的字符串,把该字符串转换成整数并输出。
例如输入字符串"345",则输出整数 345。


这一题 应该不是很难吧。 主要可能 要考虑各种情况。 这种题 只要细心 慢慢测试 都能做出来。没有什么 思路瓶颈 就不看了。贴点别人的话

 此题一点也不简单。不信,你就先不看一下的代码,
你自己先写一份,然后再对比一下,便知道了。
1.转换的思路: 每扫描到一个字符, 我们把在之前得到的数字乘以10再加上当前字符表示的
数字。
这个思路用循环不难实现。
2.由于整数可能不仅仅之含有数字,还有可能以'+'或者'-'开头,表示整数的正负。
如果第一个字符是'+'号,则不需要做任何操作;如果第一个字符是'-'号,
则表明这个整数是个负数,在最后的时候我们要把得到的数值变成负数。
3.接着我们试着处理非法输入。由于输入的是指针,在使用指针之前,
我们要做的第一件是判断这个指针是不是为空。
如果试着去访问空指针,将不可避免地导致程序崩溃。
4.输入的字符串中可能含有不是数字的字符。
每当碰到这些非法的字符,我们就没有必要再继续转换。
最后一个需要考虑的问题是溢出问题。由于输入的数字是以字符串的形式输入,
因此有可能输入一个很大的数字转换之后会超过能够表示的最大的整数而溢出。


我就不写代码了下一题


第 21 题(数组)
2010 年中兴面试题
编程求解:
输入两个整数  n  和  m,从数列 1,2,3.......n  中  随意取几个数,
使其和等于  m ,要求将其中所有的可能组合列出来.


这个在之前貌似做过类似的吧 不过当时 是只有2个数的组合 这个比那个要多 应该就是在那个的基础上 在多出来而已  其实仔细一想 有点像之前那个寻找树路径的问题。

先用一个指针从后向前遍历 到当前的数字 小于给定的数字。 然后 用给定的数字减去当前的数字。 余下的数组在继续之前的逻辑。递归调用应该可以。

写了下代码 稍微测试了一下 貌似很难测试周全啊 也不知道有没有问题。 找不到答案了 答案就到21题。 不管了 先贴上代码


	List<Integer> findData=new ArrayList<Integer>();
	public void test(int m,int n){
		int data[]=new int[n];
		for(int i=0;i<n;i++){
			data[i]=i+1;
		}
		find(data,0,n-1,m);
	}
	public void find(int []data,int beg,int end,int m){
		//首先这个方法 需要的是找出所有满足条件的数字。
		while(data[end]>m){
			--end;
			if(end<beg){
				//说明没找到 
				//findData.remove(findData.size()-1);
				return;
			}
		}
		
		if(data[end]==m){
			//找到了只有一个数就ok了 不需要在和其他书相加  !!!但是也不需要入栈了。
			System.out.println(findData+","+data[end]);
			//既然找到了 这个 那么重新调用方法 缩小范围
			if(end>beg){
				find(data,beg,end-1,m);
			}
		}else{//这个就是小于的了
			
			int mm=m-data[end];
			int nowBeg=beg;
			int nowEnd=end;
			findData.add(data[end]);
		//	while(beg<=end-1){
				if(beg<=end-1){
				find(data,beg,end-1,mm);
				}
				//beg++;
			//}
			findData.remove(findData.size()-1);
			nowEnd--;
			if(nowEnd>=0){
				find(data,0,nowEnd,m);
			}
		}

找到答案了 。因为不怎么懂c 也没有细看。 不过看他的输出结果 貌似有问题的。 感觉我的是对的。 缺少 1,3,6  1,2,7 这2个。不管了 相信自己。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值