Java学习---程序设计_面试题[2]
百度2017春招笔试真题编程题集合之买帽子
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 // 2017-10-09 2 // 题目描述 3 // 度度熊想去商场买一顶帽子,商场里有N顶帽子,有些帽子的价格可能相同。度度熊想买一顶价格第三便宜的帽子,问第三便宜的帽子价格是多少? 4 // 输入描述: 5 // 首先输入一个正整数N(N <= 50),接下来输入N个数表示每顶帽子的价格(价格均是正整数,且小于等于1000) 6 // 输出描述: 7 // 如果存在第三便宜的帽子,请输出这个价格是多少,否则输出-1 8 // 输入例子: 9 // 10 10 // 10 10 10 10 20 20 30 30 40 40 11 // 输出例子: 12 // 30 13 14 ------------------------------------------------- 15 package com.huawei.test; 16 import java.util.ArrayList; 17 import java.util.Arrays; 18 import java.util.Scanner; 19 20 /** 21 输入描述: 22 首先输入一个正整数N(N <= 50),接下来输入N个数表示每顶帽子的价格(价格均是正整数,且小于等于1000) 23 输出描述: 24 如果存在第三便宜的帽子,请输出这个价格是多少,否则输出-1 25 输入例子: 26 10 27 10 10 10 10 20 20 30 30 40 40 28 输出例子: 29 30 30 */ 31 public class Test { 32 public static void main(String[] args){ 33 Scanner scan = new Scanner(System.in); 34 while(scan.hasNext()){ 35 //输入一个正整数 36 int n = scan.nextInt(); 37 //开辟空间 38 int[] prices = new int[n]; 39 //读取价格 40 for(int i = 0; i < prices.length; i++){ 41 prices[i] = scan.nextInt(); 42 } 43 //价格排序 44 Arrays.sort(prices); 45 ArrayList<Integer> list = new ArrayList<>(); 46 //去重复 47 for(int i = 0;i < n; i++){ 48 if(!list.contains(prices[i])){ 49 list.add(prices[i]); 50 } 51 } 52 if(list.size()<3){ 53 System.out.println(-1); 54 }else{ 55 System.out.println(list.get(2)); 56 } 57 58 } 59 } 60 }
寻找三角形
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /** 2 * 题目描述 3 * 4 * 三维空间中有N个点,每个点可能是三种颜色的其中之一,三种颜色分别是红绿蓝,分别用'R', 'G', 'B'表示。 5 * 现在要找出三个点,并组成一个三角形,使得这个三角形的面积最大。 6 * 但是三角形必须满足:三个点的颜色要么全部相同,要么全部不同。 7 * 输入描述: 首先输入一个正整数N三维坐标系内的点的个数.(N <= 50) 接下来N行 8 * 每一行输入 c x y z,c为'R', 'G', 'B'的其中一个。 9 * x,y,z是该点的坐标。(坐标均是0到999之间的整数) 10 * 输出描述: 输出一个数表示最大的三角形面积,保留5位小数。 11 * 输入例子: 12 * 5 13 * R 0 0 0 14 * R 0 4 0 15 * R 0 0 3 16 * G 92 14 7 17 * G 12 16 8 18 * 输出例子: 6.00000 19 */ 20 package com.ftl.test; 21 import java.util.ArrayList; 22 import java.util.Arrays; 23 import java.util.Scanner; 24 public class Test { 25 public static void main(String[] args) { 26 Scanner sc = new Scanner(System.in); 27 // 输入一个正整数N 28 System.out.println("Please input the Num:"); 29 int n = sc.nextInt(); 30 // N行 N 个数组 31 String[] nums = new String[n]; 32 // 初始化 33 double temp = 0.0; 34 double area = Double.MAX_VALUE; 35 // 输入N行,用数组保存 36 for (int i = 0; i < n; i++) { 37 nums[i] = sc.nextLine(); 38 } 39 // 获取颜色 40 char[] colors = new char[n]; 41 for (int i = 0; i < n; i++) { 42 colors[i] = nums[i].split(" ")[0].charAt(0); 43 } 44 // 获取X轴 45 int[] x = new int[n]; 46 for (int i = 0; i < n; i++) { 47 x[i] = Integer.parseInt(nums[i].split(" ")[1]); 48 } 49 // 获取Y轴 50 int[] y = new int[n]; 51 for (int i = 0; i < n; i++) { 52 x[i] = Integer.parseInt(nums[i].split(" ")[2]); 53 } 54 // 获取Z轴 55 int[] z = new int[n]; 56 for (int i = 0; i < n; i++) { 57 x[i] = Integer.parseInt(nums[i].split(" ")[3]); 58 } 59 // 进行判断 三个点的颜色要么全部相同,要么全部不同 60 for (int i = 0; i < n; i++) { 61 for (int j = i + 1; j < n; j++) { 62 for (int k = j + 1; k < n; k++) { 63 if (colors[i] == colors[j] && colors[j] == colors[k] 64 || colors[i] != colors[j] && colors[j] != colors[k] 65 && colors[k] != colors[i]) { 66 if (colors[i] == colors[j] && colors[j] == colors[k] 67 || colors[i] != colors[j] 68 && colors[j] != colors[k] 69 && colors[i] != colors[k]) { 70 double a = Math 71 .pow(Math.pow(Math.abs(x[i] - x[j]), 2) 72 + Math.pow(Math.abs(y[i] - y[j]), 2) 73 + Math.pow(Math.abs(z[i] - z[j]), 2), 74 0.5); 75 double b = Math 76 .pow(Math.pow(Math.abs(x[i] - x[k]), 2) 77 + Math.pow(Math.abs(y[i] - y[k]), 2) 78 + Math.pow(Math.abs(z[i] - z[k]), 2), 79 0.5); 80 double c = Math 81 .pow(Math.pow(Math.abs(x[k] - x[j]), 2) 82 + Math.pow(Math.abs(y[k] - y[j]), 2) 83 + Math.pow(Math.abs(z[k] - z[j]), 2), 84 0.5); 85 86 double p = (a + b + c) / 2; 87 // 海伦公式求空间三角形面积 88 temp = Math.pow(p * (p - a) * (p - b) * (p - c), 89 0.5); 90 if (area < temp) { 91 area = temp; 92 } 93 } 94 } 95 } 96 } 97 } 98 System.out.printf("%.2f",area); 99 } 100 }
输出不同的元素的个数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.ftl; 2 /** 3 * 输入字符串长度len1,字符串s1,字符串长度len2,字符串s2。 4 * 从后向前比较,以最短字符串为标准,输出不同的元素的个数。 5 * 例如: 输入:s1="1,3,5" len1=3 s2="2,4,1,7,5" len2=5 6 输出:2 7 函数原型 public int getDiffNum(int len1, String s1, int len2, String s2) 8 * 9 * @author ftl 10 */ 11 12 public class HWText { 13 public static void main(String[] args){ 14 String s1="1,3,5"; 15 int len1=3; 16 String s2="2,4,2,7,6"; 17 int len2=5; 18 int diffNum= getDiffNum(s1,len1,s2,len2); 19 System.out.println("不同的数目:"+diffNum); 20 } 21 22 public static int getDiffNum(String s1,int len1, String s2, int len2){ 23 int num = 0; 24 //字符串转换为字符数组 25 String[] str1 = s1.split(","); 26 String[] str2 = s2.split(","); 27 //以最端的字符串为标准(换言之,就是确定循环的次数) 28 int len = len1<len2?len1:len2; 29 for (int i = 0; i < len; i++) { 30 //判断是否相等 31 if(!str1[len1-1-i].equals(str2[len2-1-i])){ 32 num++; 33 } 34 } 35 return num; 36 } 37 }
混合运算
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.ftl; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 /** 7 输入一个表达式,没有括号,数字小于0-9之间,输出计算结果,所有的中间结果化为整形。 8 例如: 输入:3+8×2/9-2 9 输出:2 10 * @author ftl 11 */ 12 13 public class HWText { 14 public static void main(String[] args){ 15 String s="3+8×2/9-2 "; 16 int result=getMyRet(s); 17 System.out.println("最后结果:"+result); 18 } 19 20 public static int getMyRet(String s){ 21 int len = s.length(); 22 List<String> list = new ArrayList<>(); 23 //字符串变成集合 24 for(int i = 0; i < len; i++){ 25 list.add(s.charAt(i)+""); 26 } 27 System.out.println("list--->"+ list);//list--->[3, +, 8, ×, 2, /, 9, -, 2, 28 for(int i = 0; i<list.size(); i++){ 29 if(list.get(i).equals("x")){ 30 //计算乘法 31 int ji = Integer.parseInt(list.get(i-1))*Integer.parseInt(list.get(i+1)); 32 //将积放在集合中,整个位置都后移一位,8现在是i的位置 33 list.add(i-1,ji+""); 34 //删除原来的位置 35 list.remove(i); //删除8 36 list.remove(i); //删除* 37 list.remove(i); //删除2 38 System.out.println("list--x后->"+ list);//list--x后->[3, +, 16, /, 9, -, 2, ] 39 //回到积的位置,再次参与运算 40 i--; 41 }else if(list.get(i).equals("/")){ 42 int shang = Integer.parseInt(list.get(i-1))/Integer.parseInt(list.get(i+1)); 43 list.add(i-1,shang+""); 44 list.remove(i); //删除16 45 list.remove(i); //删除/ 46 list.remove(i); //删除9 47 System.out.println("list--/后->"+ list);//list--/后->[3, +, 1, -, 2, ] 48 i--; //回到商的位置 49 } 50 } 51 //新的list,只有+-,注意用新的变量k,否则会编译报错 52 for(int k=0;k<list.size();k++){//这个时候是新的size 53 if(list.get(k).equals("+")){ 54 int he=Integer.parseInt(list.get(k-1))+Integer.parseInt(list.get(k+1)); 55 list.add(k-1,he+""); 56 list.remove(k); 57 list.remove(k); 58 list.remove(k); 59 System.out.println("list--+后->"+ list); //list--+后->[4, -, 2, ] 60 k--; 61 } 62 if(list.get(k).equals("-")){ 63 int cha=Integer.parseInt(list.get(k-1))-Integer.parseInt(list.get(k+1)); 64 list.add(k-1,cha+""); 65 list.remove(k); 66 list.remove(k); 67 list.remove(k); 68 System.out.println("list-- -后->"+ list); //list-- -后->[2, ] 69 k--; 70 } 71 } 72 return Integer.parseInt(list.get(0)); 73 } 74 }
二叉树算法描述
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 二叉树的遍历是指按照某条搜索路径访问树中的每个节点,使得每个节点的均只被访问一次。由二叉树的递归定义,遍历一棵二叉树便要决定对根节点、左子树和右子树的访问顺序。 2 常见的遍历次序有先序遍历、中序遍历和后序遍历。其中序指的是根节点在何时被访问。 3 先序遍历(PreOrder):若二叉树非空,则先访问根节点,再访问左子树,最后访问右子树。 4 中序遍历(InOrder):若二叉树非空,则先访问左子树,再访问根节点,最后访问右子树。 5 后序遍历(PostOder):若二叉树非空,则先访问左子树,再访问右子树,最后访问根节点。
统计字符串中某个字符出现的次数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.ftl; 2 3 public class HelloFtl { 4 public static void main(String[] args) { 5 // TODO 自动生成的方法存根 6 System.out.println("----------------------------------------"); 7 String str = "want you know one thing"; 8 int count = 0; 9 int count1 = 0; 10 char[] c = str.toCharArray(); 11 for ( int i = 0; i < c.length; i++) 12 { 13 if (c[i] == 'o') 14 { 15 count++; 16 } 17 if (c[i] == 'n') 18 { 19 count1++; 20 } 21 } 22 System.out.println("O出现的次数为:" + count); 23 System.out.println("n出现的次数为:" + count1); 24 System.out.println("----------------------------------------"); 25 int c1 = 0; 26 while ( str.indexOf("n") != -1) //indexOf存在则返回所处位置,否则返回-1 27 { 28 29 c1++; 30 //改变字符串数量 31 str = str.substring(str.indexOf("n") + 1); 32 System.out.println("Str " 33 + "为:" + str); 34 35 } 36 System.out.println("n出现的次数为:" + c1); 37 } 38 39 }
输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.ftl; 2 3 import java.util.HashMap; 4 import java.util.Map; 5 /** 6 *题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。 7 *1.程序分析:利用循环,使用Map存储数据.其实完全可以使用4个变量来解决,这边舍近求远复习下Map啦 8 * 9 * @author 小a玖拾柒 10 * Date: 2018年8月18日 11 * 12 */ 13 public class Test2018 { 14 public static void main(String[] args) { 15 String str = "abcd 1234 ef *"; 16 check(str); 17 check2(str); 18 check3(str); 19 } 20 // 方案一: 设定变量,根据数组ch[i]实现 21 private static void check(String str) { 22 int shuzi = 0; 23 int zifu = 0; 24 int kongge = 0; 25 int qita = 0; 26 char[] ch = str.toCharArray(); 27 for(int i = 0; i < ch.length; i++){ 28 if(String.valueOf(ch[i]).matches("\\d+")){ 29 shuzi++; 30 }else if(String.valueOf(ch[i]).matches("\\w+")){ 31 zifu++; 32 }else if(String.valueOf(ch[i]).matches("\\s+")){ 33 kongge++; 34 }else{ 35 qita++; 36 } 37 } 38 System.out.println("【方案一】" + "数字:" + shuzi + "、字符:" + zifu + "、空格:" + kongge + "、其他:" + qita); 39 } 40 // 方案二: 设定变量,根据charAt(i)实现 41 private static void check2(String str) { 42 int shuzi = 0; 43 int zifu = 0; 44 int kongge = 0; 45 int qita = 0; 46 for(int i = 0; i < str.length(); i++){ 47 if(String.valueOf(str.charAt(i)).matches("\\d+")){ 48 shuzi++; 49 }else if(String.valueOf(str.charAt(i)).matches("\\w+")){ 50 zifu++; 51 }else if(String.valueOf(str.charAt(i)).matches("\\s+")){ 52 kongge++; 53 }else{ 54 qita++; 55 } 56 } 57 System.out.println("【方案二】" +"数字:" + shuzi + "、字符:" + zifu + "、空格:" + kongge + "、其他:" + qita); 58 } 59 // 方案三: 设定变量,根据map实现 60 private static void check3(String str) { 61 Map<String,Integer> map = new HashMap<>(); 62 map.put("数字",0); 63 map.put("字符",0); 64 map.put("空格",0); 65 map.put("其他",0); 66 for(int i = 0; i < str.length(); i++){ 67 if(String.valueOf(str.charAt(i)).matches("\\d+")){ 68 map.put("数字", map.get("数字")+1); 69 }else if(String.valueOf(str.charAt(i)).matches("\\w+")){ 70 map.put("字符", map.get("字符")+1); 71 }else if(String.valueOf(str.charAt(i)).matches("\\s+")){ 72 map.put("空格", map.get("空格")+1); 73 }else{ 74 map.put("其他", map.get("其他")+1); 75 } 76 } 77 System.out.println("【方案三】" +map); 78 } 79 }
简单的登录验证系统
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.ftl; 2 3 import java.io.BufferedReader; 4 import java.io.IOException; 5 import java.io.InputStreamReader; 6 7 class Check 8 { 9 private int age = 11; 10 11 // 内部类 12 public boolean validate(String name, String password) 13 { 14 if (name.equals("ftl") && 15 password.equals("1012")) 16 { 17 return true; 18 } 19 else 20 { 21 return false; 22 } 23 24 } 25 } 26 27 class Operate 28 { 29 private String info[]; 30 31 public Operate(String info[]) 32 { 33 this.info = info; 34 } 35 public String login() 36 { 37 Check check = new Check(); 38 String name = this.info[0]; 39 String password = this.info[1]; 40 String str = null; 41 if (check.validate(name, password)) 42 { 43 str = "Welcome " + name.toUpperCase() +" comingg "; 44 } 45 else 46 { 47 str = "No Welcome " + name.toUpperCase() +" comingg "; 48 } 49 return str; 50 } 51 } 52 53 public class HelloFtl 54 { 55 public static void main(String args[]) 56 { 57 String[] arg = new String[2]; 58 BufferedReader buf = new BufferedReader(new InputStreamReader(System.in)); 59 System.out.println("Input the name and password[换行表示结束]: ") ; 60 for(int i = 0; i < arg.length; i++ ){ 61 try 62 { 63 arg[i] = buf.readLine() ; 64 } catch (IOException e) 65 { 66 // TODO Auto-generated catch block 67 e.printStackTrace(); 68 } 69 } 70 boolean flag = new Check().validate(arg[0], arg[1]); 71 System.out.println("-------------------------------------------"); 72 if(flag){ 73 Operate oper = new Operate(arg); 74 System.out.println(oper.login()); 75 System.out.println("黄沙百战穿金甲,不破楼兰终不还"); 76 } 77 78 } 79 }
加减乘除计算
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.ftl; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 /** 7 输入一个表达式,没有括号,数字小于0-9之间,输出计算结果,所有的中间结果化为整形。 8 例如: 输入:3+8×2/9-2 9 输出:2 10 * @author ftl 11 */ 12 13 public class HWText { 14 public static void main(String[] args){ 15 String s="3+8×2/9-2 "; 16 int result=getMyRet(s); 17 System.out.println("最后结果:"+result); 18 } 19 20 public static int getMyRet(String s){ 21 int len = s.length(); 22 List<String> list = new ArrayList<>(); 23 //字符串变成集合 24 for(int i = 0; i < len; i++){ 25 list.add(s.charAt(i)+""); 26 } 27 System.out.println("list--->"+ list);//list--->[3, +, 8, ×, 2, /, 9, -, 2, 28 for(int i = 0; i<list.size(); i++){ 29 if(list.get(i).equals("x")){ 30 //计算乘法 31 int ji = Integer.parseInt(list.get(i-1))*Integer.parseInt(list.get(i+1)); 32 //将积放在集合中,整个位置都后移一位,8现在是i的位置 33 list.add(i-1,ji+""); 34 //删除原来的位置 35 list.remove(i); //删除8 36 list.remove(i); //删除* 37 list.remove(i); //删除2 38 System.out.println("list--x后->"+ list);//list--x后->[3, +, 16, /, 9, -, 2, ] 39 //回到积的位置,再次参与运算 40 i--; 41 }else if(list.get(i).equals("/")){ 42 int shang = Integer.parseInt(list.get(i-1))/Integer.parseInt(list.get(i+1)); 43 list.add(i-1,shang+""); 44 list.remove(i); //删除16 45 list.remove(i); //删除/ 46 list.remove(i); //删除9 47 System.out.println("list--/后->"+ list);//list--/后->[3, +, 1, -, 2, ] 48 i--; //回到商的位置 49 } 50 } 51 //新的list,只有+- 52 for(int k=0;k<list.size();k++){//这个时候是新的size 53 if(list.get(k).equals("+")){ 54 int he=Integer.parseInt(list.get(k-1))+Integer.parseInt(list.get(k+1)); 55 list.add(k-1,he+""); 56 list.remove(k); 57 list.remove(k); 58 list.remove(k); 59 System.out.println("list--+后->"+ list); //list--+后->[4, -, 2, ] 60 k--; 61 } 62 if(list.get(k).equals("-")){ 63 int cha=Integer.parseInt(list.get(k-1))-Integer.parseInt(list.get(k+1)); 64 list.add(k-1,cha+""); 65 list.remove(k); 66 list.remove(k); 67 list.remove(k); 68 System.out.println("list-- -后->"+ list); //list-- -后->[2, ] 69 k--; 70 } 71 } 72 return Integer.parseInt(list.get(0)); 73 } 74 }
生成随记不重复ID
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 import java.util.Random; 2 3 /** 4 * 各种id生成策略 5 * <p>Title: IDUtils</p> 6 * <p>Description: </p> 7 * @version 1.0 8 */ 9 public class IDUtils { 10 11 /** 12 * 图片名生成 13 */ 14 public static String genImageName() { 15 //取当前时间的长整形值包含毫秒 16 long millis = System.currentTimeMillis(); 17 //long millis = System.nanoTime(); 18 //加上三位随机数 19 Random random = new Random(); 20 int end3 = random.nextInt(999); 21 //如果不足三位前面补0 22 String str = millis + String.format("%03d", end3); 23 24 return str; 25 } 26 27 /** 28 * 商品id生成 29 */ 30 public static long genItemId() { 31 //取当前时间的长整形值包含毫秒 32 long millis = System.currentTimeMillis(); 33 //long millis = System.nanoTime(); 34 //加上两位随机数 35 Random random = new Random(); 36 int end2 = random.nextInt(99); 37 //如果不足两位前面补0 38 String str = millis + String.format("%02d", end2); 39 long id = new Long(str); 40 return id; 41 } 42 43 public static void main(String[] args) { 44 for(int i=0;i< 100;i++) 45 System.out.println(genItemId()); 46 } 47 }
就餐问题抽查情况
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /** 2 问题描述: 某公司由于人多,午餐分为多批次就餐,严格要求每批次就餐时间。并定期抽查就餐情况。请编写程序实现就餐抽查情况。 3 • 要求实现函数: void check_lunch(int num, int time,int input[], int output[]) 4 【输入】 int num,就餐总人数 int time,就餐分批数 char input[],就餐情况 5 【输出】 char output[], 违规就餐情况 6 【返回】 无 注:对就餐分3批的情况,12人就餐,正确的就餐情况应如下分布[1,2,3,1,2,3,1,2,3,1,2,3],不符合该分布的即是违规,输出时对相应位置0。 7 • 示例 8 1) 输入:num = 12,time = 3,input =[1,2,3,3,1,3,1,1,1,1,2,3] 输出:output = [1,2,3,0,0,3,1,0,0,1,2,3] 9 2) 输入:num = 11,time = 4,input =[1,2,3,4,2,3,3,4,1,2,3] 输出:output = [1,2,3,4,0,0,3,4,1,2,3] 10 • 算法思路: 11 比较简单,对数组中的元素进行取余运算判断与输入的关系 12 •算法代码: 13 * @author ftl 14 */ 15 16 public class FTL2018 { 17 public static void main(String[] args){ 18 int[] num = {1,2,3,3,1,3,1,1,1,1,2,3}; 19 int[] output = sort(num, num.length); 20 } 21 public static int[] sort(int[] num, int len){ 22 int count = 0; 23 int output[] = new int[len]; 24 System.out.println("输入数据:" + Arrays.toString(num)); 25 for (int i = 1; i <= len; i++) { 26 // 位置上的数字准确 27 if(i % 3 == num[i-1]){ 28 output[i-1] = num[i-1]; 29 }else if(i % 3 == 0 && num[i-1] == 3) { 30 output[i-1] = num[i-1]; 31 }else{ 32 output[i-1] = 0; 33 } 34 if(output[i-1] == 0){ 35 count++; 36 } 37 } 38 System.out.println("输出数据:" + Arrays.toString(output)); 39 System.out.println("共有" + count + "个人违规"); 40 41 return output; 42 43 44 } 45 }
输入联想【正则匹配】
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.ftl; 2 3 import java.util.ArrayList; 4 import java.util.Arrays; 5 import java.util.List; 6 import java.util.regex.Matcher; 7 import java.util.regex.Pattern; 8 9 /** 10 问题描述: 输入联想功能是非常实用的一个功能,请编程实现类似功能。 11 • 要求实现函数: void auto_complete(char *str, char *tmp,char *output) 12 【输入】 char *str,候选字符串 char *tmp,输入字符串 13 【输出】 int *output,联想匹配的字符串 14 【返回】 无 注:候选字符串以空格隔开,输入字符串仅从字符串开始处匹配。将匹配的子字符串输出,同样以空格隔开。如无匹配成功的子字符串,则输出空字符串。 15 • 示例 16 1) 输入:str = chengdu chongqing,tmp = c 输出:output = chengdu Chongqing 17 2) 输入:str = chengdu chongqing,tmp = che 输出:end = Chengdu 18 3) 输入:str = beijing nanjing,tmp = jing 输出:end = 19 •算法思路:字符串匹配,充分利用容器string的优势,给出两种代码:一种利用string,一种利用字符串数组。 20 21 •算法代码: 22 * @author ftl 23 */ 24 25 public class FTL2018 { 26 public static void main(String[] args){ 27 String str = "chengdu,chongqing,changan"; 28 String tmp = "che"; 29 auto_complete(str, tmp); 30 auto_complete1(str, tmp); 31 } 32 //方案一: 利用正则进行查找 33 public static void auto_complete(String str, String tmp){ 34 List<String> list = new ArrayList<>(); 35 String[] s = str.split(","); 36 for(int i = 0; i < s.length; i++){ 37 String regex = tmp + "[a-zA-Z]"; 38 Matcher p = Pattern.compile(regex).matcher(s[i]); 39 if(p.find()){ 40 list.add(s[i]); 41 } 42 } 43 System.out.println("匹配成功["+ list.size() +"]\n" + list); 44 } 45 //方案二: 利用String类的startWith()方法 46 public static void auto_complete1(String str, String tmp){ 47 List<String> list = new ArrayList<>(); 48 String[] s = str.split(","); 49 for(int i = 0; i < s.length; i++){ 50 if(s[i].startsWith(tmp)){ 51 list.add(s[i]); 52 } 53 } 54 System.out.println("匹配成功["+ list.size() +"]\n" + list); 55 } 56 }
正则学习
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.ftl; 2 3 import java.util.regex.Matcher; 4 import java.util.regex.Pattern; 5 6 public class Test2018 { 7 public static void main(String[] args) { 8 //需要进行爬虫的字符串 9 String s = "shshska13966668888hdjd13966668888iaj"; 10 //写正则 11 String regex = "s\\w"; 12 //把正则表达式编译成一个正则对象 13 Pattern p = Pattern.compile(regex); 14 //获取匹配器 15 Matcher m = p.matcher(s); 16 while(m.find()){ 17 System.out.println(m.group()); 18 } 19 } 20 }
有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.ftl; 2 3 import java.util.Arrays; 4 import java.util.Collections; 5 import java.util.List; 6 import java.util.Vector; 7 8 /** 9 * 题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。 10 * @author 小a玖拾柒 11 * Date: 2018年8月18日 12 */ 13 14 public class Test2018 { 15 16 public static void main(String[] args) { 17 int[] ch = new int[]{1,2,3,5,6,7,9,12,16}; //已经排好序的数组 18 int num = 15; 19 // 方案一: 排序判断,有小问题,针对此案例,问题不大 20 addNumber(ch, num ); 21 22 // 方案二: 利用Collections工具类 23 List<Integer> list = new Vector<>(); 24 for(int i = 0; i < ch.length; i++){ 25 list.add(ch[i]); 26 } 27 list.add(num); 28 Collections.sort(list); 29 System.out.println("【方案二】:" + list); 30 31 // 方案三: 利用System类 32 String str = "1,2,3,5,6,7,9,12,16"; 33 String[] arr = str.split(","); 34 String[] abc = new String[arr.length + 1]; 35 int flag = 0; 36 for(int i = 0; i < arr.length; i++){ 37 if(Integer.valueOf(arr[i]) > num){ 38 flag = i; 39 break; 40 } 41 } 42 System.arraycopy(arr, 0, abc, 0, flag); 43 abc[flag] = String.valueOf(num); 44 System.arraycopy(arr, flag, abc, flag+1, 1); 45 System.out.println("【方案三】:" + Arrays.toString(abc)); 46 } 47 48 public static int[] addNumber(int[] ch, int num){ 49 50 int[] arr = new int[ch.length + 1]; 51 int tmp = 0; 52 for(int i = 0; i < ch.length; i++){ 53 // 如果小,则不动 54 if(ch[i] < num){ 55 arr[i] = ch[i]; 56 }else{ 57 arr[i] = num; 58 tmp = i; 59 break; 60 } 61 } 62 for(int i = tmp ; i < ch.length; i++){ 63 arr[i+1] = ch[i]; 64 } 65 System.out.println("【方案一】:" + Arrays.toString(arr)); 66 return arr; 67 } 68 }
有200个小朋友拉成一个圆圈,从其中某一个小朋友开始依次编号1-200,从1号小朋友开始循环1-3报数,数到3的小朋友就退出。编写一个Java应用程序,计算出最后一个小朋友的号码是多少。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.ftl; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 import java.util.Scanner; 6 7 /** 8 * 有200个小朋友拉成一个圆圈,从其中一个小朋友开始依次编号1-200, 9 * 从1号小朋友开始循环1-3报数,数到3的小朋友就退出。 10 * 编写一个Java应用程序,计算出最后一个小朋友的号码是多少。 11 * 12 * 1 2 3 1 2 3 1 2 3 13 * @author 小a玖拾柒 14 * Date: 2018年8月18日 15 */ 16 17 public class Test2018 { 18 19 public static void main(String[] args) { 20 System.out.println("输入有多少个小朋友:"); 21 Scanner s = new Scanner(System.in); 22 int n = s.nextInt(); 23 24 List<Integer> l = new ArrayList<Integer>(); 25 for(int i=1; i<=n; i++){ 26 l.add(i); 27 } 28 System.out.println(play(l, 0, 3)); 29 } 30 31 /** 32 * @param l 剩下小朋友List 33 * @param n 第n个开始报数 34 * @param m 数到m的人退出 35 * @return 最后一个小朋友的号码 36 */ 37 public static int play(List<Integer> list, int n, int m){ 38 int num = list.size(); 39 // 仅剩余一个学生, 返回最后一个学生的信息 40 if(num <= 1 ){ 41 return list.get(0); 42 }else{ 43 n = n + m - 1; 44 while(n >= num) 45 n = n - num; 46 list.remove(n); 47 return play(list, n, m); 48 } 49 } 50 }
取一个整数a从右端开始的4~7位
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 package com.ftl; 2 3 import java.util.ArrayList; 4 import java.util.Arrays; 5 import java.util.Collections; 6 import java.util.List; 7 import java.util.Scanner; 8 9 /** 10 取一个整数a从右端开始的4~7位。 11 * @author 小a玖拾柒 12 * Date: 2018年8月18日 13 */ 14 15 public class Test2018 { 16 17 public static void main(String[] args) { 18 int a = 123456789; 19 // 方案一: 利用数组进行数组反转输出 20 String str = String.valueOf(a); 21 char[] arr = new char[str.length()]; 22 for(int i = 0; i < arr.length; i++){ 23 arr[arr.length-i-1] = str.charAt(i); 24 } 25 System.out.println("【方案一】:"); 26 for(int i = 3; i < 7; i++){ 27 System.out.print(arr[i] + "\t"); 28 } 29 30 // 方案二: 利用list进行数组反转输出 31 List<Character> list = new ArrayList<>(); 32 for(int i = 0; i < arr.length; i++){ 33 list.add(str.charAt(i)); 34 } 35 Collections.reverse(list); 36 System.out.println("\n【方案二】:"); 37 for(int i = 3; i < 7; i++){ 38 System.out.print(list.get(i) + "\t"); 39 } 40 // 方法三: 41 System.out.println("\n【方案三】:"); 42 getNum(a, 4, 7); 43 } 44 public static void getNum(int a, int m, int n){ 45 int[] ans = new int[n-m+1]; 46 for(int i=1,j=0; j<ans.length && a>0;i++){ 47 if(i>=m && i<=n){ 48 ans[j] = a%10; 49 j++; 50 } 51 a = a / 10; 52 } 53 54 for(int i=ans.length-1; i>=0; i--){ 55 System.out.print(ans[i]+"\t"); 56 } 57 System.out.println(); 58 } 59 }
作者:小a玖拾柒
-------------------------------------------
个性签名: 所有的事情到最後都是好的,如果不好,那說明事情還沒有到最後~
本文版权归作者【小a玖拾柒】和【博客园】共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利!