微软面试100题-天天做-第6题
2014-03-26 13:52
267 查看
第6题(数组)
腾讯面试题:
给你10分钟时间,根据上排给出十个数,在其下排填出对应的十个数
要求下排每个数都是先前上排那十个数在下排出现的次数。
上排的十个数如下:
【0,1,2,3,4,5,6,7,8,9】
举一个例子,
数值: 0,1,2,3,4,5,6,7,8,9
分配: 6,2,1,0,0,0,1,0,0,0
0在下排出现了6次,1在下排出现了2次,
2在下排出现了1次,3在下排出现了0次....
以此类推..
这道题真抓狂啊
效率很低,但是能解决问题
腾讯面试题:
给你10分钟时间,根据上排给出十个数,在其下排填出对应的十个数
要求下排每个数都是先前上排那十个数在下排出现的次数。
上排的十个数如下:
【0,1,2,3,4,5,6,7,8,9】
举一个例子,
数值: 0,1,2,3,4,5,6,7,8,9
分配: 6,2,1,0,0,0,1,0,0,0
0在下排出现了6次,1在下排出现了2次,
2在下排出现了1次,3在下排出现了0次....
以此类推..
这道题真抓狂啊
package com.microsoft; public class UpDownCount { private Measure[][]momery; private int[]data; private int []solve; public UpDownCount(int []data){ this.data=data; this.solve=new int[data.length]; this.momery=new Measure[data.length][data.length]; for(int i=0;i<momery.length;i++){ for(int j=0;j<momery[i].length;j++){ momery[i][j]=null; } } } public void solve(){ Measure m=new Measure(); m.multipySum=data.length; m.rowSum=data.length; System.out.println(solve(0,data.length-1,m,0)); for(int i=0;i<solve.length;i++){ System.out.print(solve[i]+" "); } } public boolean solve(int start,int end,Measure m,int lever){ if(start>end){ return false; } if(m.rowSum<0||m.multipySum<0){ return false; } if(start==end){ for(int i=data.length-1;i>=0;i--){ solve[start]=data[i]; int tmp=m.rowSum; if(tmp*data[start]==m.multipySum&&solve[start]==m.rowSum){ //System.out.println(111); boolean countOk=true; for(int j=0;j<data.length;j++){ if(count(data[j])!=solve[j]){ countOk=false; } } //for(int a=0;a<solve.length;a++){ // System.out.print(solve[a]+" "); //} //System.out.println(); //System.out.println(countOk); return countOk; } } return false; }else{ for(int i=data.length-1;i>=0;i--){ solve[start]=data[i]; int prefix=0; for(int k=0;k<start;k++){ prefix+=solve[k]; } if(prefix>data.length){ return false; } Measure measure=new Measure(); measure.multipySum=m.multipySum-solve[start]*data[start]; measure.rowSum=m.rowSum-solve[start]; boolean s=solve(start+1,end,measure,lever+1); if(!s){ continue; } int sum=0; int multiSum=0; for(int j=start;j<=end;j++){ sum+=solve[j]; multiSum+=solve[j]*data[j]; } boolean countOk=true; if(lever==0){ if(multiSum==m.multipySum&&sum==m.rowSum){ for(int j=start;j<end;j++){ if(count(data[j])!=solve[j]){ countOk=false; } } }else{ countOk=false; } } if(s){ if(lever==0&&countOk){ return true; }else if(lever==0){ continue; } return true; } } return false; } } private int count(int value){ int count=0; for(int i=0;i<solve.length;i++){ if(solve[i]==value){ count++; } } return count; } private class Measure{ private int rowSum; private int multipySum; } public static void main(String[] args) { int[] data=new int[]{0,1,2,3,4,5,6,7,8,9}; UpDownCount cunt=new UpDownCount(data); cunt.solve(); } }
效率很低,但是能解决问题
package com.microsoft; public class UpDownCount { private Measure[][]momery; private int[]data; private int []solve; public UpDownCount(int []data){ this.data=data; this.solve=new int[data.length]; this.momery=new Measure[data.length][data.length]; for(int i=0;i<momery.length;i++){ for(int j=0;j<momery[i].length;j++){ momery[i][j]=null; } } } public void solve(){ Measure m=new Measure(); m.multipySum=data.length; m.rowSum=data.length; System.out.println(solve(0,data.length-1,m,0)); for(int i=0;i<solve.length;i++){ System.out.print(solve[i]+" "); } } public boolean solve(int start,int end,Measure m,int lever){ if(start>end){ return false; } if(m.rowSum<0||m.multipySum<0){ return false; } if(start==end){ for(int i=data.length-1;i>=0;i--){ solve[start]=data[i]; int tmp=m.rowSum; if(tmp*data[start]==m.multipySum&&solve[start]==m.rowSum){ boolean countOk=true; for(int j=0;j<data.length;j++){ if(count(data[j])!=solve[j]){ countOk=false; } } return countOk; } } return false; }else{ for(int i=data.length-1;i>=0;i--){ solve[start]=data[i]; int prefix=0; for(int k=0;k<start;k++){ prefix+=solve[k]; } if(prefix>data.length){ return false; } Measure measure=new Measure(); measure.multipySum=m.multipySum-solve[start]*data[start]; measure.rowSum=m.rowSum-solve[start]; boolean s=solve(start+1,end,measure,lever+1); if(!s){ continue; } return s; } return false; } } private int count(int value){ int count=0; for(int i=0;i<solve.length;i++){ if(solve[i]==value){ count++; } } return count; } private class Measure{ private int rowSum; private int multipySum; } public static void main(String[] args) { int[] data=new int[]{0,1,2,3,4,5,6,7,8,9}; UpDownCount cunt=new UpDownCount(data); cunt.solve(); } }
相关文章推荐
- 微软面试100题-天天做-第一题
- 微软面试100题之第6题
- 微软面试100题-天天做-第二题
- 微软面试100题-天天做-第5题
- 网友答案整理I:微软等面试100题系列之网友精彩回复 [一]
- 微软等面试100题答案V0.2版[第1-20题答案]
- July的微软面试100题系列尝试解答(1~5题)
- 永久勘误:微软等面试100题系列,答案V0.3版[第21-40题答案]
- 微软面试100题2010年版全部答案集锦(含下载地址)
- 全新整理:微软、谷歌、百度等公司经典面试100题[第1-60题]
- 微软面试100题系列---判断两个链表是否相交
- 微软面试100题系列---交换元素使2个序列的差值最小
- 永久优化:微软技术面试100题第11-20题答案修正与优化
- 微软等数据结构+算法面试100题(14)--实现strstr 功能
- 微软等数据结构+算法面试100题(40)-- 旋转数组中的最小元素
- July 微软面试100题 第17题 字符串中第一个只出现一次的字符
- 精选微软经典的算法面试100题(第1-20题) -代码详解(题目选自“结构之法”大侠的博客,答案都是本菜鸟自己做的)
- 精选微软等公司数据结构+算法经典面试100题及答案
- 微软面试100题-58从尾到头输出链表
- 微软100题-天天做-第14题