`
eddysheng
  • 浏览: 111960 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

一道软件面试题

阅读更多

从第一行的第一个数字开始,计算下一行临近的两个数字中较大的一个,统计所有临近较大数字的总和,看下例:

 

    5

   9 6

 4 6 8

0 7 1 5

 

 

计算总和为:5+9+6+7=27

 

用程序计算附件中的总和值。

 

simplest Demo:

 

package algorith;

import java.io.InputStream;
import java.util.List;

import org.apache.commons.io.IOUtils;

public class TestTriangle {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception {
		InputStream ins = TestTriangle.class.getResourceAsStream("file2.txt");
		List<String> lines = IOUtils.readLines(ins);
		for(String line:lines){
			//System.out.println(line);
		}
		int[][] arrays = new int[lines.size()][];
		int i = 0;
		for(String line:lines){
			String[] temp = line.split(" ");			
			arrays[i] = getIntArray(temp);			
			i++;
		}
		int max = getMax(arrays);
		System.out.println("Max=="+max);
	}
	
	public static int[] getIntArray(String[] strs){
		int[] temp = new int[strs.length];
		int i = 0;
		//StringBuffer sb = new StringBuffer("");
		for(String s:strs){
			temp[i] = Integer.parseInt(s);
			//sb.append(temp[i]).append("-");
			i++;
		}
		//System.out.println("=length="+temp.length);
		return temp;
	}
	
	public static int getMax(int[][] arrays){
		int max = arrays[0][0];
		//System.out.println("=number="+arrays[0][0]);
		int px=0,py=0;
		for(int i=1;i<arrays.length;i++){
			px = i;
			int pyl = py;
			int pyr = py+1;
			if(arrays[px][pyl]>=arrays[px][pyr]){
				py = pyl;
			}else{
				py = pyr;
			}
			//System.out.println("=number="+arrays[px][py]);
			max += arrays[px][py];
		}
		return max;
	}

}

 

运算结果为655321,结果正确吗?

 

分享到:
评论
18 楼 徐风子 2010-07-14  
<p>原题来自:http://projecteuler.net/index.php?section=problems&amp;id=18</p>
<p> </p>
<p>java解法:</p>
<pre name="code" class="java">public static int maxSum(int[][] graph, int x, int y, int sum) {
  if (x == 14)
    return sum+graph[x][y];
  int max = max = Math.max(maxSum(graph, x+1, y, sum),  maxSum(graph, x+1, y+1, sum));
  sum += graph[x][y];
  return sum+max;
}</pre>
<p> 很简单嘛。</p>
<p> </p>
<p>随便贴一段里面最牛逼的解题代码:</p>
<pre name="code" class="Haskell">triangle =
    [[75],
     [95, 64],
     ... Snip ...
     [04, 62, 98, 27, 23, 09, 70, 98, 73, 93, 38, 53, 60, 04, 23]]

main = print (foldr1 reduce triangle)
    where reduce a b = zipWith (+) a (zipWith max b (tail b))</pre>
17 楼 eddysheng 2010-07-14  
昨晚想了一下,其实用动态规划算法并不适合这道题,也许上面的要求换成求自上而下相邻的数字的和的最大值,用动态规划才合适。毕竟题目的要求是下一行相邻数字中较大的一个累加,这也就决定了如果下一行相邻数字不相同的话,自上而下只有一条路可以走。

另外说一下,上面的测试程序没有考虑如果下行相邻两数字相同的情况,相同的情况就可能出现几个最终值,需要最后进行比对得出最大值。
16 楼 hz86655032 2010-07-13  
xdsnet 写道
这个分解开其实就是每行的冒泡比较出最大数然后累加吧,应该是比较简单的,复杂度应该是固定值。

哥哥,题目看清楚。
15 楼 eddysheng 2010-07-13  
这个看来用动态规划算法比较合适,刚才网上搜索了一下,发现已经很多解法,其中一个是来自http://www.java3z.com/cwbwebhome/article/article5/51198.html
内容:
public class Test{
  public static void main(String args[]){
     int n=5;
    int a[][]={{0,0,0,0,0,7,0,0,0,0,0},
               {0,0,0,0,3,0,8,0,0,0,0},
               {0,0,0,8,0,1,0,0,0,0,0},
               {0,0,2,0,7,0,4,0,4,0,0},
               {0,4,0,5,0,2,0,6,0,5,0}};
    int s[][]=new int[5][11];  
    s[0][5]=a[0][5]; 
    for(int i=1;i< n;i++){
     for(int j=1;j< 10;j++){
       s[i][j]=Math.max(s[i-1][j-1],s[i-1][j+1])+a[i][j];
     }
    }
    System.out.println("原始数据");
    for(int i=0;i< n;i++){
     for(int j=0;j< 11;j++){
       System.out.printf("%-4d",a[i][j]);
    }
    System.out.println();
   }
    
   System.out.println();
   System.out.println("对应的最大路径");
   for(int i=0;i< n;i++){
     for(int j=0;j< 11;j++){
       System.out.printf("%-4d",s[i][j]);
    }
    System.out.println();
   }
   System.out.println();
   System.out.println("最长路径的值为:");
    System.out.println(max(s[n-1]));
 
}
  public static int max(int b[]){
    int max=b[0];
   for(int i=1;i< b.length;i++){
     if(b[i]>max) max=b[i];
   }
   return max;
 }
     
}

14 楼 imtrash 2010-07-13  
不知道是不是写的罗嗦,请指正。

package MianShi;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;



public class exam1 {

	public static void main(String args[]){
		try {
			InputStream is = new FileInputStream("src/MianShi/asd.txt");
			InputStreamReader in = new InputStreamReader(is);
			BufferedReader bufReader = new BufferedReader(in);
			
			String lineContent;//每行的内容
			
			boolean firstLine = true;//是否是第一行
			
			int upperIndex = 0;//焦点index
			int preIndex;//当前行与焦点临近的前一个数的index
			int nextIndex;//当前行与焦点临近的后一个数的index
			
			int upperValue = 0;//焦点值
			int preValue;//当前行焦点前一个值
			int nextValue;//当前行焦点后一个值
			
			int total = 0;//总值
			
			while((lineContent = bufReader.readLine())!=null){
				if(firstLine){
					upperIndex = lineContent.length()-1;
					preIndex = 0;
					nextIndex = 0;
					
					upperValue = Integer.parseInt(""+lineContent.charAt(upperIndex));
					preValue = 0;
					nextValue = 0;
					
					total += upperValue;
					firstLine = false;
				}else{
					
					preIndex = upperIndex - 1;
					nextIndex = upperIndex + 1;
					
					preValue = indexGetValue(preIndex,lineContent);
					nextValue = indexGetValue(nextIndex,lineContent);
					upperValue = focused(preValue, nextValue);
					
					upperIndex = (upperValue==preValue?preIndex:nextIndex);
					
					total += upperValue;
				}
			}
			System.out.println(total);
			
			bufReader.close();
			in.close();
			is.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
	
	private static int indexGetValue(int index, String lineContent) {
		return Integer.parseInt(""+lineContent.charAt(index));
	}

	private static int focused(int pre, int next){
		return pre>next?pre:next;
	}

}


asd.txt文件内容格式如附件中图片。
13 楼 tangshuang 2010-07-13  
我不知道你的文件格式是什么样的,不过可以模拟一下,你参考一下吧:
public class Test2 {
	public static void main(String[] args) {
		StringBuffer sb = new StringBuffer();
		sb.append("5\r");
		sb.append("9 6\r");
		sb.append("4 6 8\r");
		sb.append("0 7 1 5\r");

		System.out.println(sb.toString());

		System.out.println("------------------");

		int sum = 0;
		int rowMaxIndex = 0;
		String[] rows = sb.toString().split("\r");
		for (int i = 0; i < rows.length; i++) {
			String row = rows[i];
			String[] cells = row.split(" ");
			int cellMax = Integer.parseInt(cells[0]);
			int min = rowMaxIndex <= 0 ? 0 : rowMaxIndex;
			int max = rowMaxIndex >= cells.length - 1 ? cells.length - 1
					: rowMaxIndex + 1;
			for (int j = min; j <= max; j++) {
				int temp = Integer.parseInt(cells[j]);
				if (temp > cellMax) {
					cellMax = temp;
					rowMaxIndex = j;
				}
			}
			System.out.println(cellMax);
			sum += cellMax;

		}
		System.out.println(sum);

	}
}

12 楼 angi_sky 2010-07-13  
<div class="quote_title">angi_sky 写道</div>
<div class="quote_div">
<p> </p>
<p>我做了一些修改</p>
<p>public static int getMax(int[][] arrays){   <br>         int max = arrays[0][0];   <br>         for(int i=1;i&lt;arrays.length;i++){<br>          int temp =arrays[i][0];<br>          for(int j=0;j&lt;arrays[i].length-1;j++){<br>           if(temp&lt;arrays[i][j+1]){<br>            temp=arrays[i][j+1];<br>           }<br>          }<br>          max+=temp;<br>         }   <br>         return max;   <br>     }   </p>
<p> </p>
<p>希望大家指点。</p>
<p>我理解题目出错。</p>
</div>
<p> </p>
11 楼 angi_sky 2010-07-13  
<p>楼主的getMax方法好像不正确</p>
<p>我做了一些修改</p>
<p>public static int getMax(int[][] arrays){   <br>         int max = arrays[0][0];   <br>         for(int i=1;i&lt;arrays.length;i++){<br>          int temp =arrays[i][0];<br>          for(int j=0;j&lt;arrays[i].length-1;j++){<br>           if(temp&lt;arrays[i][j+1]){<br>            temp=arrays[i][j+1];<br>           }<br>          }<br>          max+=temp;<br>         }   <br>         return max;   <br>     }   </p>
<p> </p>
<p>希望大家指点。</p>
10 楼 seele 2010-07-13  
shbgreenery 写道
结果好像正确,只是看程序好像做了一些无用功
我写了一点代码,没有别的意思,只是我先抛块砖,希望能引出玉来。
        String strFile = "file2.txt";
        File f = new File(strFile);
        int row = 0;
        int col = 0;
        int sum = 0;
        BufferedReader reader = new BufferedReader(new FileReader(f));
        for (String line = null; (line = reader.readLine()) != null;) {
            String[] str = line.split("\\s+");
            if (row == 0) {
                sum += Integer.parseInt(str[0]);
            } else {
                int a = Integer.parseInt(str[col]);
                int b = Integer.parseInt(str[col + 1]);
                if (a > b) {
                    sum += a;
                } else {
                    sum += b;
                    col += 1;
                }
            }
            row += 1;
        }
        System.out.println(sum);
        reader.close();



这样是最快的..
9 楼 braint8 2010-07-13  
几乎没接触用算法,是不是很失败,咋整
8 楼 seele 2010-07-13  
没有人尝试用递归么?
7 楼 xdsnet 2010-07-13  
这个分解开其实就是每行的冒泡比较出最大数然后累加吧,应该是比较简单的,复杂度应该是固定值。
6 楼 shbgreenery 2010-07-13  
淡夏的斌 写道
shbgreenery 写道
结果好像正确,只是看程序好像做了一些无用功
我写了一点代码,没有别的意思,只是我先抛块砖,希望能引出玉来。
        String strFile = "file2.txt";
        File f = new File(strFile);
        int row = 0;
        int col = 0;
        int sum = 0;
        BufferedReader reader = new BufferedReader(new FileReader(f));
        for (String line = null; (line = reader.readLine()) != null;) {
            String[] str = line.split("\\s+");
            if (row == 0) {
                sum += Integer.parseInt(str[0]);
            } else {
                int a = Integer.parseInt(str[col]);
                int b = Integer.parseInt(str[col + 1]);
                if (a > b) {
                    sum += a;
                } else {
                    sum += b;
                    col += 1;
                }
            }
            row += 1;
        }
        System.out.println(sum);
        reader.close();


这段代码好像有问题的吧

有什么问题呢?难道是说没有类名和主函数名?
5 楼 kingjiang09 2010-07-13  

读每行的前两位存入一个2维整形数组,不足两位用0补

int total=0;
for(int [] num:array){
if(num[0]>num[1]){
total+=num[0];
}else{
total+=num[1];
}
}
4 楼 淡夏的斌 2010-07-12  
shbgreenery 写道
结果好像正确,只是看程序好像做了一些无用功
我写了一点代码,没有别的意思,只是我先抛块砖,希望能引出玉来。
        String strFile = "file2.txt";
        File f = new File(strFile);
        int row = 0;
        int col = 0;
        int sum = 0;
        BufferedReader reader = new BufferedReader(new FileReader(f));
        for (String line = null; (line = reader.readLine()) != null;) {
            String[] str = line.split("\\s+");
            if (row == 0) {
                sum += Integer.parseInt(str[0]);
            } else {
                int a = Integer.parseInt(str[col]);
                int b = Integer.parseInt(str[col + 1]);
                if (a > b) {
                    sum += a;
                } else {
                    sum += b;
                    col += 1;
                }
            }
            row += 1;
        }
        System.out.println(sum);
        reader.close();


这段代码好像有问题的吧
3 楼 fivestarwy 2010-07-12  
这个要用动规的,你用贪心显然错了,比如
     5
    9 6
  4  6  84
0  7  1  5
应得到100
2 楼 samwalt 2010-07-12  
只看了题目,没有看代码。
用动态规划算法吧。
1 楼 shbgreenery 2010-07-12  
结果好像正确,只是看程序好像做了一些无用功
我写了一点代码,没有别的意思,只是我先抛块砖,希望能引出玉来。
        String strFile = "file2.txt";
        File f = new File(strFile);
        int row = 0;
        int col = 0;
        int sum = 0;
        BufferedReader reader = new BufferedReader(new FileReader(f));
        for (String line = null; (line = reader.readLine()) != null;) {
            String[] str = line.split("\\s+");
            if (row == 0) {
                sum += Integer.parseInt(str[0]);
            } else {
                int a = Integer.parseInt(str[col]);
                int b = Integer.parseInt(str[col + 1]);
                if (a > b) {
                    sum += a;
                } else {
                    sum += b;
                    col += 1;
                }
            }
            row += 1;
        }
        System.out.println(sum);
        reader.close();

相关推荐

    企业公司软件测试面试笔试题集合 软件测试面试题

    企业公司软件测试面试笔试题集合 软件测试面试题 (测试基础).doc 01_企业面试试卷(综合).doc 01_企业面试试卷(综合)_参考答案.doc 04_企业面试试卷(测试基础).doc 04_企业面试试卷(测试基础)_参考答案.doc...

    常用软件测试面试题(word文档)

    软件测试是确保软件产品质量的关键环节,它涉及到一系列的测试类型、方法、工具和流程。面试中,面试官可能会考察候选...以上内容详细解释了软件测试面试题涉及的知识点,涵盖了软件测试的重要概念、过程、方法和工具。

    2022年微软公司的一道软件测试师应聘面试题.docx

    2022年微软公司的一道软件测试师应聘面试题.docx

    软件工程师经典面试题

    这些题目涵盖了多个领域的知识,包括基础数学计算、逻辑推理、编码与解码、语言学、词汇...这些题目覆盖了软件工程师面试中常见的数学、逻辑、语言理解和计算能力的考察,对于提升面试者的综合素质具有很好的参考价值。

    vcc软件软件工程师面试题[文].pdf

    首先,让我们来看一道常见的面试题——实现一个`strcpy`函数。`strcpy`函数在C/C++编程中扮演着基础且重要的角色,用于复制字符串。面试官可能会要求面试者现场编写这个函数,以此来评估面试者的编程基础和对内存...

    整理C#面试题10套

    "C#面试题10套" 本资源摘要信息涵盖了C#面试题10套,涵盖了C#、.NET、面试题...本资源摘要信息涵盖了C#、.NET、面试题等知识点,涉及到逻辑思维、规则应用、加密解密算法、软件架构、设计模式、数据库操作等技术领域。

    最新嵌入式软件工程师面试题.docx

    在嵌入式软件工程师面试题中,一道题目是使用预处理器来计算一年中有多少秒。该题目考察了预处理器的基本知识,包括: 1. #define 语法的基本知识,例如不能以分号结束、括号的使用等。 2. 预处理器将为你计算常数...

    java的一些面试题

    Java面试题涵盖了许多核心知识点,包括基础技术、项目经验、逻辑推理和SQL查询。下面将对这些方面进行详细的解析。 1. **基础技术题** - **UML图**:UML(统一建模语言)有多种图表,包括类图、对象图、用例图、...

    软件测试面试题 面经,面试必备

    软件测试面试题面经,面试必备 软件测试是软件开发过程中的一个重要步骤,它的目的是为了确保软件的质量和可靠性。在面试中,软件测试是一道必备的题目,以下是软件测试的相关知识点: 一、测试总体 1. 软件测试...

    软件测试面试题整理

    ### 软件测试面试题知识点详解 #### 1. 团队中开展软件测试的重要性 在软件开发过程中,软件测试是一项至关重要的环节。没有经过充分测试的软件很难确保其质量和稳定性,这不仅会影响用户体验,还可能导致后续维护...

    软件测试企业面试题及答案

    本资料集合包含了20套企业面试题及相应的答案,涵盖了测试基础、理论、C语言以及综合能力等多个方面,旨在帮助准备面试的软件测试人员更好地理解和掌握核心概念,提高应聘成功率。 **测试基础** 这部分面试题主要...

    一道面试题的思考

    《一道面试题的思考——深入理解memcpy函数的实现》 在C语言中,`memcpy`函数是一个非常重要的内存操作函数,用于将一块内存区域的数据复制到另一块内存区域。在面试中,这个问题常用来测试候选人的基础知识、逻辑...

    软件测试经典面试题

    ### 软件测试经典面试题解析 #### 1、什么是兼容性测试?兼容性测试侧重哪些方面?...以上只是部分经典面试题的解答示例,每一道题目都涉及到了软件测试的重要知识点。希望这些解答能够帮助您更好地准备相关的面试。

    软件公司面试题

    【标题】:“软件公司面试题”通常涉及到一系列的编程题目,旨在评估候选人在软件开发中的技术能力,特别是对C语言的掌握程度。C语言是一种基础且强大的编程语言,被广泛用于系统编程、嵌入式系统、游戏开发以及各种...

    常见的Java上机面试题

    ### 常见的Java上机面试题:深入解析与实战指南 在IT行业的求职过程中,尤其是对于软件工程师或开发者而言,上机编程面试成为了一道必经的门槛。这种形式的面试旨在全面评估应聘者的技术能力,不仅考察理论知识的...

    Java高级面试题汇总及答案(2022年Java面试题及答案大全)

    这是一道经典的Java面试题。解决这个问题需要了解Java的内存管理机制,包括FULL GC的触发条件、Perm Gen的设置、System.gc()方法的调用等。 Java集合框架 3. Java集合框架是Java语言中的一种重要概念,它提供了...

    软件测试面试题大全

    ### 软件测试面试题大全解析 #### 1. 为什么要在团队中开展软件测试工作? 在软件开发过程中,开展软件测试是非常重要的,因为这能够确保软件在发布前达到预期的质量标准。软件测试不仅有助于识别和修复软件中的...

    软件测试面试题集锦下载

    在软件开发过程中,软件测试是不可或缺的一环,它确保了产品的...理解并熟练应用这些测试方法和技术,对于软件开发团队和求职者来说至关重要,可以帮助他们在面试中展示出扎实的专业知识和实践经验,从而提高成功率。

    这是一道广为流传的微软面试题

    本篇文章将详细探讨一道经典的微软面试题——链表的反转,并通过分析其背后的逻辑和技术要点,帮助读者更好地理解和掌握这一问题。 #### 题目背景与解析 题目要求:给定一个链表的头结点,反转该链表,并返回反转...

    软件测试面试题(精品)

    在软件开发过程中,软件测试是不可或缺的一环,...理解各种测试类型及其区别,以及如何设计有效的测试用例,对于保证软件质量至关重要,尤其对于初学者和转行者,掌握这些知识将有助于他们在面试和实际工作中表现出色。

Global site tag (gtag.js) - Google Analytics