算法分析(含答案)笔试题

判断身份证:要么是 15 位,要么是 18 位,最后一位可以为字母,并写
出程序提出其中年月日。要求:
写出合格的身份证的正则表达式,
^(\d{15}|\d{17}[\dx])$
写程序提取身份证中的年月日
public class IdCard
{
private String idCard;//私有变量
public IdCard(){}//构造方法
//构造方法
public IdCard(String idCard){
this.idCard=idCard;
}

public void setIdCard(String idCard)
{
this.idCard=idCard;
}

public String getIdCard()
{
return idCard;
}

//从身份证号码中截取生日
public String getBirthday()
{
return this.getIdCard().substring(6, 14);
}

public static void main(String args[])
{
ShenFenZheng sfz = new
ShenFenZheng("420154199908157841");
//调用 getBirthday()方法获取生日
System.out.println("生日:" + sfz.getBirthday());
} }
627. 对于一个字符串,请设计一个高效算法,找到第一次重复出现的字符保
证字符串中有重复的字符,字符串的长度小于等于 500.
package com.bjsxt;
import java.util.ArrayList;
import java.util.List;
public class FirstRepeat {
public static void main(String[] args) {
System.out.println(findFirstRepeat("pmedmitjtckhxwhvpwemznh
mhzhpueainchqrftkmbjlradhmjekcqzansyzkvqhwnrdgzdbzewdmxkzrscik
daugbvygntrifnolehdtrqjlasofuvzeijbmzehkxknmjekcxswqldknysfsxr
qaqzp",152));
}
//返回:y
public static char findFirstRepeat(String A, int n) {
String[] str=A.split("");
for(int x=0;x<n;x++){
int index=0;
int num=0;
//对于每一个值,都需要从前开始遍历
while(index<=x){
if(str[index].equals(str[x])){
num++;
}
index++;
}
//该值出现了两次,说明重复了
if(num>1){
char flag=\'x\';
flag=str[x].toCharArray()[0];
return flag;
}
}
//返回该值说明已经没有重复的
return \'p\';
}
}
628. 写一个完整函数,实现拷贝数组
public class test {
public static void main(String[] args) {
int [] arr1 = {10,20,30,40,50};
int [] arr2 = CopyArray(arr1);
System.out.println(Arrays.toString(arr2));
}
private static int[] CopyArray(int[] arr) {
int [] arr2 = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
arr2[i] = arr[i];
}
return null; } }
629. 写一排序算法,输入 10 个数字,以逗号分开,可根据参数选择升序或者
降序排序,须注明是何种排序算法。
package cn.bjsxt.demo;
import java.util.Scanner;
public class SortDemo {
/**

给定的字符串使用,号分隔

@param strNumber

@return
/
public static String [] split(String strNumber){
String [] strSplit=strNumber.split(",");
return strSplit;
}
/*

将String类型的数组转换成int类型的数组

@param strSplit

@return
/
public static int [] getInt(String [] strSplit){
int arr[]=new int[strSplit.length];
for (int i = 0; i < strSplit.length; i++) {
arr[i]=Integer.parseInt(strSplit[i]);
}
return arr;
}
/*

冒泡排序

@param arr
/
public static void sort(int [] arr){
for (int i = 0; i < arr.length-1; i++) {
for (int j = 0; j < arr.length-1-i; j++) {
if (arr[j]>arr[j+1]) {
change(arr,j,j+1);
} } } }
/*

两数交换的方法

@param arr 数组

@param x 数组中元素的下标

@param y 数组中元素的下标
/
public static void change(int [] arr,int x,int y){
int temp=arr[x];
arr[x]=arr[y];
arr[y]=temp;
}
/*

测试类

@param args
*/
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
System.out.println("请输入一个数字串,每个数字以逗号分隔
");
String str=input.next();
//调用方法
String [] s=split(str);//使用逗号分隔
int [] arr=getInt(s);//调有获得整型数组的方法
sort(arr);//调用排序的方法
for (int i : arr) {
System.out.print(i+"\t");
} } }

判断字符串是否是这样的组成的,第一个字母,后面可以是字母、数字、
下划线、总长度为 5-20。
package cn.bjsxt.demo;
import java.util.Scanner;
public class StringDemo {
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
System.out.println("请输入一个字符串,第一个字符必须是字母:
");
String str=input.next();
if (str.length()<5||str.length()>20) {
System.out.println("对不起,字符串的长度必须在5-20之 间!");
}else{
char []ch=str.toCharArray();
if (Character.isLetter(ch[0])) {//判断第一个字符是否是
字母
for (int i = 1; i < ch.length; i++) {
if
(!Character.isLetterOrDigit(ch[i])&&ch[i]!=\'_\') {
System.out.println("字符串不符合要求");
break; } } } } } }

已排好序的数组 A,一般来说可用二分查找可以很快找到,现有一特殊
数组 A,它是循环递增的,如 a[]={17, 19 ,20, 25, 1, 4, 7, 9},在这样的
数组中找一元素,看看是否存在。请写出你的算法,必要时可写伪代码,并
分析其空间,时间复杂度。
思路说明:循环递增数组有这么一个性质:以数组中间元素将循环递增数组划分为两部
分,则一部分为一个严格递增数组,而另一部分为一个更小的循环递增数组。当中间元
素大于首元素时,前半部分为严格递增数组,后半部分为循环递增数组;当中间元素小
于首元素时,前半部分为循环递增数组;后半部分为严格递增数组。
记要检索的元素为 e,数组的首元素为 a[low],中间元素为 a[mid],末尾元素为 a[high]。
则当 e 等于 a[mid] 时,直接返回 mid 的值即可;当 e 不等于 a[mid] 时:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgfxsw.html