Oracle面试
2012-10-30 14:22
155 查看
在深圳面了三面。第一面是一半中文一半英文。二三面都是英文。看起来应该是印度人。讲的英语不是很能听懂。听不懂的就让他写下来。面试官还是比较和蔼的。
遇到了一个比较困难的问题。就是最大不连续子段和。
在一个数组中,找到一组数,让这组数之和最大,前提条件是,找到的数不能有任何两个在原来的数组中是相邻的。
这个题目如果以前没有接触过,还是比较难一时想出来的。
如果是暴力的算法,那么时间复杂度是非常高的。这里想一个动态规划的算法。
先看代码:
这里的思路是,考虑第i项,第i-1项和第i-2项。
动态规划转移方程如下:
dp[i]=max(dp[i-2],dp[i-2]+data[i],dp[i-1],dp[i-1]+data[i])
不过上述方程是有条件的,只有在dp[i-1]中没有加data[i-1],才能计算dp[i-1]+data[i]。
如果data[i]小于等于0,那么这个第i项直接可以不用考虑加入子集合。
----------------------------
还有一个题目是,java中,反转一个字符串,只能用String类中的length函数取得字符串的长度,其他函数均不能使用。请写出代码。
这个题目是三面的,也没有做出来。
下面的代码使用了递归和substring、charAt函数来实现反转。
遇到了一个比较困难的问题。就是最大不连续子段和。
在一个数组中,找到一组数,让这组数之和最大,前提条件是,找到的数不能有任何两个在原来的数组中是相邻的。
这个题目如果以前没有接触过,还是比较难一时想出来的。
如果是暴力的算法,那么时间复杂度是非常高的。这里想一个动态规划的算法。
先看代码:
package stringutils; public class A { public static void main(String[] s) { // int[] data = new int[] { 2, -1, -1, 6, -3, 7 }; int[] data = new int[] { 1, 2, 3, -4, 5, 6, 7, 8 }; System.out.println(get(data)); } public static int get(int[] data) { if (data.length == 0) { return Integer.MAX_VALUE * -1; } if (data.length == 1) { return data[0]; } if (data.length == 2) { return data[0] > data[1] ? data[0] : data[1]; } boolean[] flags = new boolean[data.length];// 表明下标为i的值有没有加i之前的那项 int[] dp = new int[data.length]; dp[0] = data[0] < 0 ? 0 : data[0]; if (data[0] <= 0) { flags[0] = false; } else { flags[0] = true; } if (data[1] <= 0) { flags[1] = false; } else { flags[1] = true; } dp[1] = data[1] < 0 ? 0 : data[1]; for (int i = 2; i < data.length; i++) { if (data[i] <= 0) { flags[i] = false;// false表明没加当前项 dp[i] = max(dp[i - 2], dp[i - 1]); } else { if (flags[i - 1] == false) {// i-1没有加下标为i-1的项 flags[i] = true; dp[i] = dp[i - 1] + data[i];// 这里data[i]必定大于0 } else { flags[i] = false; dp[i] = max(dp[i - 2] + data[i], dp[i - 1]);// 如果i-1加了data中下标为i-1的项 } } } return dp[data.length - 1]; } public static int max(int a, int b) { return a > b ? a : b; } public static int max(int a, int b, int c) { return max(a, b) > c ? max(a, b) : c; } }
这里的思路是,考虑第i项,第i-1项和第i-2项。
动态规划转移方程如下:
dp[i]=max(dp[i-2],dp[i-2]+data[i],dp[i-1],dp[i-1]+data[i])
不过上述方程是有条件的,只有在dp[i-1]中没有加data[i-1],才能计算dp[i-1]+data[i]。
如果data[i]小于等于0,那么这个第i项直接可以不用考虑加入子集合。
----------------------------
还有一个题目是,java中,反转一个字符串,只能用String类中的length函数取得字符串的长度,其他函数均不能使用。请写出代码。
这个题目是三面的,也没有做出来。
下面的代码使用了递归和substring、charAt函数来实现反转。
package comz; public class TT { public static void main(String[] args) { String s = "abcde"; System.out.println(reverseString(s));// edcba } public static String reverseString(String s) { if (s == null || s.equals("") || s.length() == 1) { return s; } char c = s.charAt(s.length() - 1); return c + reverseString(s.substring(0, s.length() - 1)); } }
相关文章推荐
- [面试][oracle] 数据库去重的三种方法:
- oracle面试题目总结
- oracle 经典面试题目
- 【面试虐菜】—— Oracle知识整理《收获,不止Oracle》
- Oracle面试问题汇总
- ORACLE 面试问题-技术篇(2)
- Oracle分页查询,面试你值得关注!
- 一些基础的Oracle DBA笔试题和面试题目
- oracle、db2、sybase大型数据库面试总结
- [面试][oracle] 数据库去重的三种方法:
- Oracle面试问题
- oracle面试题目总结
- Oracle经典面试SQL
- 一道Oracle面试年薪70W的DBA题目
- ORACLE 面试问题-技术篇
- Oracle 数据库开发 面试试题
- java面试要点---oracle,mysql,DB2数据库的分页
- oracle面试题目总结
- MSSQL和Oracle的区别及大数据处理(面试会问,加分亮点)
- 讲解Oracle面试过程中常见的二十个问题