几道算法题不是很难哈

简介: 《基础系列》

判断身份证:要么是15位,要么是18位,最后一位可以为字母,并写出程序提出其中年月日。要求:

写出合格的身份证的正则表达式,

^(\d{15}|\d{17}[\dx])$

写程序提取身份证中的年月日


publicclassIdCard

{

    privateString idCard;//私有变量

    publicIdCard(){}//构造方法

   //构造方法

   publicIdCard(String idCard){

       this.idCard=idCard;

     }

 

    publicvoidsetIdCard(String idCard)

    {

        this.idCard=idCard;

    }

 

    publicString getIdCard()

    {

        returnidCard;

    }

 

    //从身份证号码中截取生日

    publicString getBirthday()

    {

      returnthis.getIdCard().substring(614);

    }

 

    publicstaticvoidmain(String args[])

    {

        ShenFenZheng sfz = newShenFenZheng("420154199908157841");

         //调用getBirthday()方法获取生日

        System.out.println("生日:"+ sfz.getBirthday());

    }

}


对于一个字符串,请设计一个高效算法,找到第一次重复出现的字符保证字符串中有重复的字符,字符串的长度小于等于500.


packagecom.bjsxt;

importjava.util.ArrayList;

importjava.util.List;

publicclassFirstRepeat {

 

publicstaticvoidmain(String[] args) {

System.out.println(findFirstRepeat("pmedmitjtckhxwhvpwemznhmhzhpueainchqrftkmbjlradhmjekcqzansyzkvqhwnrdgzdbzewdmxkzrscikdaugbvygntrifnolehdtrqjlasofuvzeijbmzehkxknmjekcxswqldknysfsxrqaqzp",152));

}

//返回:y

    publicstaticcharfindFirstRepeat(String A, intn) {

     String[] str=A.split("");

     for(intx=0;x<n;x++){

      intindex=0;

      intnum=0;

      //对于每一个值,都需要从前开始遍历

      while(index<=x){

       if(str[index].equals(str[x])){

        num++;

       }

       index++;

      }

      //该值出现了两次,说明重复了

      if(num>1){

       charflag='x';

       flag=str[x].toCharArray()[0];

       returnflag;

      }

     }

     //返回该值说明已经没有重复的

     return'p';

    }

}


写一个完整函数,实现拷贝数组


publicclasstest {

 

publicstaticvoidmain(String[] args) {

int[] arr1 = {10,20,30,40,50};

int[] arr2 = CopyArray(arr1);

 

System.out.println(Arrays.toString(arr2));

}

 

privatestaticint[] CopyArray(int[] arr) {

int[] arr2 = newint[arr.length];

for(inti = 0; i < arr.length; i++) {

arr2[i] = arr[i];

}

returnnull;

}

}


写一排序算法,输入10个数字,以逗号分开,可根据参数选择升序或者降序排序,须注明是何种排序算法。


packagecn.bjsxt.demo;

 

importjava.util.Scanner;

 

publicclassSortDemo {

/**

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

 * @param strNumber

 * @return

 */

publicstaticString [] split(String strNumber){

String [] strSplit=strNumber.split(",");

returnstrSplit;

}

/**

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

 * @param strSplit

 * @return

 */

publicstaticint[] getInt(String [] strSplit){

intarr[]=newint[strSplit.length];

for(inti = 0; i < strSplit.length; i++) {

arr[i]=Integer.parseInt(strSplit[i]);

}

returnarr;

}

/**

 * 冒泡排序

 * @param arr

 */

publicstaticvoidsort(int[] arr){

for(inti = 0; i < arr.length-1; i++) {

for(intj = 0; j < arr.length-1-i; j++) {

if(arr[j]>arr[j+1]) {

change(arr,j,j+1);

}

}

}

}

/**

 * 两数交换的方法

 * @param arr 数组

 * @param x 数组中元素的下标

 * @param y 数组中元素的下标

 */

publicstaticvoidchange(int[] arr,intx,inty){

inttemp=arr[x];

arr[x]=arr[y];

arr[y]=temp;

}

/**

 * 测试类

 * @param args

 */

publicstaticvoidmain(String[] args) {

Scanner input=newScanner(System.in);

System.out.println("请输入一个数字串,每个数字以逗号分隔");

String str=input.next();

 

//调用方法

String [] s=split(str);//使用逗号分隔

int[] arr=getInt(s);//调有获得整型数组的方法

sort(arr);//调用排序的方法

for(inti : arr) {

System.out.print(i+"\t");

}

}

}


判断字符串是否是这样的组成的,第一个字母,后面可以是字母、数字、下划线、总长度为5-20。


packagecn.bjsxt.demo;

 

importjava.util.Scanner;

 

publicclassStringDemo {

publicstaticvoidmain(String[] args) {

Scanner input=newScanner(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(inti = 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] 时:

1) a[mid] > a[low],即数组前半部分为严格递增数组,后半部分为循环递增数组时,若key小于a[mid]并且不小于a[low]时,则key落在数组前半部分;否则,key落在数组后半部分。

2) a[mid] < a[high],即数组前半部分为循环递增数组,后半部分为严格递增数组时,若key大于a[mid]并且不大于a[high]时,则key落在数组后半部分;否则,key落在数组前半部分。

这种方式的时间复杂度为:O(log(n)),空间复杂度为O(1)。


publicclassTestBinarySearch {

publicstaticvoidmain(String[] args) {

// 定义数组

int[] a = { 1719202125147};

// 调用改进后的二分查找法求索引

intpos = search(a, 7);

System.out.println("要查找的元素的索引为:"+ pos);

}

 

/** 改进后的二分查找法:e为要查找的元素 */

publicstaticintsearch(int[] a, inte) {

intlow = 0;

inthigh = a.length - 1;

intmid = 0;

intpos = -1// 返回-1,表示查找失败

// 如果low < high,说明循环查找结束,直接返回-1;否则循环查找

while(low <= high) {

// mid为中间值索引

mid = (low + high) / 2;

// 如果中间值刚好是e,则查找成功,终止查找,e的索引为mid

if(a[mid] == e) {

pos = mid;

break;

}

// 如果a[low] <= a[mid],说明原数组的前半部分是严格递增的,后半部分是一个更小的循环递增数组

if(a[low] <= a[mid]) {

// 如果要查找的元素e小于a[mid]并且不小于a[low]时,则说明e落在数组前半部分

if(a[low] <= e && e < a[mid]) {

high = mid - 1;

else{// 否则的话,需要在数组的后半部分继续查找

low = mid + 1;

}

else{// 否则,后半部分是严格递增的,前半部分是一个更小的循环递增数组

// 如果要查找的元素e大于a[mid]并且不大于a[high]时,则说明e落在数组后半部分

if(a[mid] < e && e <= a[high]) {

low = mid + 1;

else{// 否则的话,需要在数组的前半部分继续查找

high = mid - 1;

}

}

}

returnpos;

}

}

相关文章
|
4月前
|
算法
分享几道大厂面试算法题
分享几道大厂面试算法题
|
7月前
【编程题-错题集】非对称之美(找规律 / 贪心)
【编程题-错题集】非对称之美(找规律 / 贪心)
|
7月前
|
算法 前端开发 JavaScript
面试必会的几道算法
面试必会的几道算法
算法_每日一题(9.15)
算法_每日一题(9.15)
|
算法 JavaScript 前端开发
日拱算法:解两道“杨辉三角”题
什么是“杨辉三角”,想必大家并不陌生~~ 在「杨辉三角」中,每个数是它左上方和右上方的数的和。
算法_每日一题(9.6)
算法_每日一题(9.6)
|
算法 测试技术 API
算法_每日一题(9.4)
算法_每日一题(9.4)
算法_每日一题(9.12)
算法_每日一题(9.12)
算法_每日一题(9.14)
算法_每日一题(9.14)
算法_每日一题(9.7)
算法_每日一题(9.7)