一些面试题求准确答案
1,写出连接池的伪代码实现,要求实现getConnection()方法,并且有最大最小连接数。
2,写一个方法求一个字符串里面的每个字符和它的个数,如 “aabbcccerrrajjjb”;
3,狗叫了,主人醒了,小偷吓跑了,主人和小偷是被动的并且还有可扩展性,用什么样的设计模式并写出代码。
4,一个队列最多的元素为M,怎么用表达式表达出来,是个选择题,选项不记得了。
5,用非递归方法实现下列函数的值。
f(1)=1
f(2)=2
f(n)=f(n-1)+f(n-2)
[解决办法]
5.
非递归的菲波那契(Fibonacci)数列算法相信递归的 菲波那契(Fibonacci) 数列 算法程序大家都会写,在计算比较小的数字的时候没什么问题,但是随着数字增大,运算复杂度则成2的指数级(相乘)倍数递增。不信的话,大家可以写个递归的算法,算一下 Fibonacci(50)看看要多久,再看看Fibonacci(40),Fibonacci(30),差别大的一P。呵呵,,,,
闲极无聊,这里弄个基于加法的算法,复杂度为O(n)
//优化后的Fibonacci数列算法,非递归!!!!
long Fibonacci(int n)
{
long coef1=1,coef2=1,coef_tmp=0;
int j=0;
if(n<3)
return 1;
j=n-1;
while(j>2)
{
coef_tmp=coef1;
coef1=coef1+coef2;
coef2=coef_tmp;
j--;
}
return coef1+coef2;
}
//递归算法,参考
long Recur_Fibonacci(int n)
{
if (n>1) {
return Recur_Fibonacci(n-1)+Recur_Fibonacci(n-2);
}
if (n==1) {
return 1;
}
if (n==0) {
return 0;
}
return 0;
}
////
试了一下,效果还是不错的。
http://calmet.spaces.live.com/blog/cns!3C0C35EFD6F5F063!250.entry
[解决办法]
- Java code
1.//普通的连接类public class ConnectionManager { /** * 得到数据库连接 * * @return 数据库连接对象 * @throws ClassNotFoundException * @throws SQLException */ public static Connection getCon() { try { String driver = "com.microsoft.sqlserver.jdbc.SQLServerDriver"; Class.forName(driver); return DriverManager.getConnection("jdbc:sqlserver://localhost:1433;DatabaseName=zf", "sa", "sa"); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } /** * 关闭所有连接 * @param con 数据库连接 * @param ps * @param rs */ public static void closeAll(Connection con, PreparedStatement ps, ResultSet rs) { try { if (rs != null) { rs.close(); } if (ps != null) { ps.close(); } if (con != null && !con.isClosed()) { con.close(); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } }}//代理的连接对象public class ConnectionAdvice implements InvocationHandler { //获取真实的对象 private Connection realCon; public ConnectionAdvice(Connection realCon) { // TODO Auto-generated constructor stub this.realCon=realCon; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // TODO Auto-generated method stub //获取方法名 String methodName=method.getName(); //判断是否为关闭的方法 if("close".equals(methodName)){ System.out.println("代理该方法"); //将代理对象放到池子中 ConnectionPool.restore((Connection)proxy); return null; }else{ //如果不是则用原有连接执行原有的方法 return method.invoke(realCon, args); } }}//代理工厂通过真实对象创建代理对象public class ProxyFactory { //通过真实的对象获取代理对象 public static Connection create(Connection realCon){ //通过代理类Proxy Connection proxy=(Connection) Proxy.newProxyInstance( //类加载器 realCon.getClass().getClassLoader(), //获取它的所有接口 realCon.getClass().getInterfaces(), //调用处理器 new ConnectionAdvice(realCon)); return proxy; }}//连接池public class ConnectionPool { //用LinkedList集合存取连接 private static List<Connection> conList=new LinkedList<Connection>(); //最大连接数 private static final int Total=10; private static int curNum=5;//最小连接数 static{ for (int i = 0; i < 5; i++) { //获取代理的连接 Connection proxy=ProxyFactory.create(ConnectionManager.getCon()); //添加到集合中 conList.add(proxy); } } //从池子中获取连接的方法 public static synchronized Connection getCon(){ Connection proxyCon=null; //如果集合中有连接 if(conList.size()>0){ if(conList.size()<=5){ //从集合中获取一个连接 proxyCon=conList.get(0); //从集合中删除该连接 conList.remove(0); return proxyCon; }else{ curNum-=5; for (int i = 0; i < 5; i++) { conList.remove(0); } proxyCon=conList.get(0); //从集合中删除该连接 conList.remove(0); return proxyCon; } }else{ //如果集合中没有连接了 //当前总数小于最大连接数,则增加5 if(curNum<Total){ curNum+=5; for (int i = 0; i < 5; i++) { //获取代理的连接 Connection proxy=ProxyFactory.create(ConnectionManager.getCon()); //添加到集合中 conList.add(proxy); } proxyCon=conList.get(0); //从集合中删除该连接 conList.remove(0); return proxyCon; }else{ //如果等于最大连接数,则抛出异常让用户等待 try { throw new Exception("连接已经满,请等待!"); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } } } //放回到池子中! public static synchronized void restore(Connection proxyCon){ conList.add(proxyCon); } }2. //写一个方法求一个字符串里面的每个字符和它的个数 public void show(String s){ if(s!=null){ for (int i = 0; i < s.length(); i++) { System.out.println(s.substring(i, i+1)); } System.out.println("它的个数为:"+s.length()); }else{ System.out.println("为NULL"); } }3.不会4.没看明白5. /** * 用非递归方法实现下列函数的值。 f(1)=1 f(2)=2 f(n)=f(n-1)+f(n-2) */ public int fun(int n){ if(n<=0) return -1;//表示异常 if(n==1) return 1; if(n==2) return 2; int[] num=new int[n]; num[0]=1; num[1]=2; //从第三个数开始计算 for (int i = 2; i < num.length; i++) { num[i]=num[i-1]+num[i-2]; } return num[n-1]; }
[解决办法]
2.
- Java code
import java.util.Map;import java.util.Scanner;import java.util.Set;import java.util.TreeMap;public class F { public static void main(String[] args) { System.out.println("你随意输入:"); Scanner scanner = new Scanner(System.in); String strs = scanner.nextLine(); char[] charArr = strs.toCharArray(); // 使用TreeMap让其自动排序 Map<Character, Integer> map = new TreeMap<Character, Integer>(); for (char c : charArr) { Integer count = map.get(c); count = count == null ? 1 : count + 1; map.put(c, count); } Set<Character> set = map.keySet(); for (Character c : set) { System.out.println(c + "出现的次数:" + map.get(c)); } }}
[解决办法]
二
- Java code
public Map<Character, Integer> charNum(String s) { Map<Character, Integer> map = new HashMap<Character, Integer>(); int[] arr = new int[128]; for (int i = 0; i < s.length(); i++) arr[s.charAt(i)]++; for (int i = 0; i < arr.length; i++) if(arr[i] != 0) map.put((char)i, arr[i]); return map; }
[解决办法]
- C/C++ code
//第二题来个C++版的#include <iostream>#include <map>#include <pair.h>#define my_pair pair<char,int>using namespace std;void findCharacterNum(string str){ map<char,int> result; map<char, int>::iterator itr; pair<map<char, int>::iterator, bool > pa; for(unsigned int i = 0; i < str.length(); i++) { pa = result.insert(my_pair(str[i],1)); if(!pa.second) { itr = result.find(str[i]); itr->second++; } } for(itr = result.begin(); itr != result.end(); itr++) { cout<<itr->first<<"="<<itr->second<<endl; }}int main(int argc, char *argv[]){ findCharacterNum("aaabbbcbeff"); return 0; }/*结果a=3b=4c=1e=1f=2*/
[解决办法]
看了下,先把第二题做了,代码如下:
void CCOUNTDlg::OnButton(CString m_content)
{
// TODO: Add your control notification handler code here
char ch;
CString s;
CString temp;
temp=m_content;
while(temp.GetLength()!=0)
{
int len=temp.GetLength();
int count=0;
ch=temp.GetAt(0);
count=1;
if(temp.GetLength()<2)
{
count=1;
s.Format("字符串中字符%c的个数是:%d\n",ch,count);
m_result+=s;
break;
}
for(int j=1;j<len;j++)
{
if(temp.GetAt(j)==ch)
{
count++;
}
}
s.Format("字符串中字符%c的个数是:%d\n",ch,count);
m_result+=s;
temp.Remove(ch);
}
MessageBox(m_result);
}
其他的题我慢慢想,想好再回答!
希望更多的人把这样的面试题晒出来让大家做,欢迎!
[解决办法]
第二题:用正则表达式
- Java code
public static void main( String[] args ) { String s = "aabbwercbnmasgccersdfrrajjjb"; String s2 = ""; String[] arr = s.split( "(?<=\\G.{1})" ); Arrays.sort( arr ); for ( String i : arr ) { s2 += i; } Matcher m = Pattern.compile( "(\\w)\\1*" ).matcher( s2 ); while ( m.find() ) { System.out.println( m.group().substring( 0, 1 ) + "的个数:" + m.group().length() ); } }
[解决办法]
#include <stdio.h>
/**
* @brief 计算字符串中的各个字符的个数
* @notes 只适用单字符数据,对于类似中文的,不支持, 且只是在函数体打印结果,可返回,但需整理
* @param data 源数据
* @return 完成 0
* 失败 -1
**/
int charactor_num(const char *data)
{
int flag_array[128];
int i = 0;
int data_len = 0;
if (NULL == data) {
return -1;
}
for (i = 0; i < 128; i++) {
flag_array[i] = '\0';
}
data_len = strlen(data);
for (i = 0; i < data_len; i++) {
flag_array[data[i]]++;
}
for (i = 0; i < 128; i++) {
if (0 != flag_array[i]) {
printf("%c num is:%d\n", i, flag_array[i]);
}
}
return 0;
}
int main(int argc, char **argv)
{
charactor_num("aslkdfjoaiedfjlefndakslfjadoijlekjwqojdlasfjdkjfnvlzxnvklj");
return 0;
}
[解决办法]
第三题:这样解决可以吗?
package csdn;
//定义人的类
class People
{
public void wakeUp()
{
};
public void runAway()
{
}
}
//主人是继承人
class Master extends People
{
public void wakeUp()
{
System.out.println("What happened with the dog?");
}
}
//当然贼也是继承人
class Thief extends People
{
public void runAway()
{
System.out.println("you cann't see me,you cann't see me,you cannn't........");
}
}
//看门狗的类
class Dog
{
void shout()
{
Master master = new Master();
Thief thief = new Thief();
System.out.println("The dog is yelling");
master.wakeUp();
thief.runAway();
}
}
public class dog_man_thief
{
public static void main(String[] args)
{
Dog dog = new Dog();
dog.shout();
}
}