1.从键盘输入一组数(用,分割),排序后输出
【分析】使用Scanner类获取键盘输入。以下代码都放在main函数中
System.out.println("请输入一串数字,用,隔开:"); Scanner scan = new Scanner(System.in); String str = scan.nextLine(); String[] strarr = str.split(","); int len = strarr.length; int[] num = new int[len]; for(int i=0;i<len;i++){ num[i]=Integer.parseInt(strarr[i]); } for(int i=0;i<len-1;i++){ for(int j=i+1;j<len;j++){ if(num[i]>num[j]){ int tem = num[i]; num[i]=num[j]; num[j]=tem; } } } for(int k : num){ System.out.print(k+" "); }
方法二:使用ArrayList,纯为了练习
System.out.println("请输入一串数字,用,隔开:"); Scanner scan = new Scanner(System.in); String str = scan.nextLine(); ArrayList<Integer> list = new ArrayList<Integer>(); for(String s : strarr){ list.add(Integer.parseInt(s)); } int len = list.size(); for(int i=0;i<len-1;i++){ for(int j=i+1;j<len;j++){ if(list.get(i)>list.get(j)){ int tem = list.get(i); list.set(i, list.get(j)); list.set(j, tem); } } } for(int k : list){ System.out.print(k+" "); }
2. 编程实现:从字符中获取连续数组序列,如字符串"a1dl2iad9j3la5kudp7u9pn4blj8ap5u3e6ml9a"中可以得到的连续数字序列为1234556.【注】:只考虑一位,因此最长的数字序列为:0123456789
【方法一】
String str = "a1dl2iad9j3la5kudp7u9pn4blj8ap5u3e6ml9a"; int len = str.length(); ArrayList<Integer> array = new ArrayList<Integer>(); ArrayList<Integer> result = new ArrayList<Integer>(); for(int i = 0;i<len; i++){ char tem = str.charAt(i); if(tem>='0'&&tem<='9'){ array.add(Integer.parseInt(String.valueOf(tem))); } } int size = array.size(); int first = array.get(0); result.add(first); for(int i =1,j=0;i<size;i++){ if(array.get(i)-result.get(j) == 1){ result.add(array.get(i)); j++; } } for(int k : result){ System.out.print(k+" "); }
【方法er】使用正则匹配,纯为练手
String str = "a1dl2iad9j3la5kudp7u9pn4blj8ap5u3e6ml9a"; // String[] num = Pattern.compile("[\\D]").split(str,-1); // \d表示数字,\D表示非数字(等价于^0-9) String[] num = Pattern.compile("[^0-9]").split(str,-1); int k = 0; ArrayList<Integer> result = new ArrayList<Integer>(); for(int i = 0;i<num.length;i++){ if(num[i]!=null&&!num[i].equals("")){ result.add(Integer.parseInt(String.valueOf(num[i]))); k = i; break; } } for(int i = k,j=0;i<num.length;i++){ if(num[i]!=null&&!num[i].equals("")){ int tem =Integer.parseInt(String.valueOf(num[i])); if(tem-result.get(j)==1){ result.add(tem); j++; } } } for(int n : result){ System.out.print(n+" "); }
3.编程实现单链表逆转
4.用递归方法实现斐波那契数列的前10项之和。
(可参考:http://jerrygao.iteye.com/blog/101283)
5. 500人围成一圈报数,数到3的人出列,下面的人继续从1开始报数,求最后一个出列的人的编号(用数组模拟链表实现)。这实际上是一个约瑟夫出圈问题: n个人围成一个圈,一个个首尾相连的圈报数,从第一个开始报数,报到m的人出圈,剩下的人继续从1开始报数,直到所有人都出圈为止。 两种方法实现,数据和链表。
6.
算法程序题:
该公司笔试题就1个,要求在10分钟内作完。
题目如下:用1、2、2、3、4、5这六个数字,用java写一个main函数,打印出所有不同的排列,如:512234、412345等,要求:"4"不能在第三位,"3"与"5"不能相连。
基本思路:
1 把问题归结为图结构的遍历问题。实际上6个数字就是六个结点,把六个结点连接成无向连通图,对于每一个结点求这个图形的遍历路径,所有结点的遍历路径就是最后对这6个数字的排列组合结果集。
2 显然这个结果集还未达到题目的要求。从以下几个方面考虑:
1. 3,5不能相连:实际要求这个连通图的结点3,5之间不能连通, 可在构造图结构时就满足改条件,然后再遍历图。
2. 不能有重复: 考虑到有两个2,明显会存在重复结果,可以把结果集放在TreeSet中过滤重复结果
3. 4不能在第三位: 仍旧在结果集中去除满足此条件的结果。
我采用二维数组定义图结构,最后的代码是:
import java.util.Iterator; import java.util.TreeSet; public class TestQuestion { private String[] b = new String[]{"1", "2", "2", "3", "4", "5"}; private int n = b.length; private boolean[] visited = new boolean[n]; visited =falsh; private int[][] a = new int[n][n]; private String result = ""; private TreeSet TreeSet = new TreeSet(); public static void main(String[] args) { new TestQuestion().start(); } private void start() { for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (i == j) { a[i][j] = 0; } else { a[i][j] = 1; } } }a[3][5] = 0; a[5][3] = 0; for (int i = 0; i < n; i++) { this.depthFirstSearch(i); } Iterator it = set.iterator(); while (it.hasNext()) { String string = (String) it.next(); if (string.indexOf("4") != 2) { System.out.println(string); } } } private void depthFirstSearch(int startIndex) { visited[startIndex] = true; result = result + b[startIndex]; if (result.length() == n) { TreeSet .add(result); } for(int j = 0; j < n; j++) { if (a[startIndex][j] == 1 && visited[j] == false) { depthFirstSearch(j); } else { continue; } } result = result.substring(0, result.length() -1); visited[startIndex] = false; } }