基础的算法题

简介: 基础系列

判断字符串是否是这样的组成的,第一个字母,后面可以是字母、数字、下划线、总长度为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;

}

}

请编写一个完整的程序,实现如下功能:从键盘输入数字n,程序自动计算n!并输出。(注1:n!=1*2*3...*n, 注2:请使用递归实现)

思路说明:因为n! = (n-1)! * n,所以要求n!首先要求出(n-1)!,而(n-1)! = (n-1-1)! * (n-1),以此类推,直到n = 1为止。


importjava.util.Scanner;

publicclassTestFactorial {

publicstaticvoidmain(String[] args) {

System.out.print("请输入一个整数:");

Scanner sc = newScanner(System.in);

intn = sc.nextInt();

System.out.println(n + "的阶乘是:"+ factorial(n));

}

/**求阶乘的方法*/

publicstaticintfactorial(intn) {

if(n == 1){

return1;

}

returnfactorial(n - 1) * n;

}

}

请用递归的方法计算斐波那契数列的同项F(n),已知F0=0,F1=1,F(n)=F(n-1)+F(n-2)(n>=2,n∈N*).

思路说明:斐波那契数列的排列是:0,1,1,2,3,5,8,13,21,34,55,89,144……,特别指出的是0不是第一项而是第0项;因为F(n)=F(n-1)+F(n-2),所以要求F(n)首先要求出F(n-1)和F(n-2),而F(n-1)=F(n-1-1)+F(n-1-2),以此类推,直到,F(2)=F(1)+F(0)为止,已知F(1) = 1,F(0) = 0。


importjava.util.Scanner;

publicclassTestFibo {

publicstaticvoidmain(String[] args) {

System.out.print("请输要求斐波那契数列的第几项:");

Scanner sc = newScanner(System.in);

intn = sc.nextInt();

System.out.println("斐波那契数列的第"+ n + "是:"+ fibo(n));

}

publicstaticintfibo(intn) {

if(n == 0){

return0;

elseif(n == 1){

return1;

}

returnfibo(n -1) + fibo(n - 2);

}

}

相关文章
|
机器学习/深度学习 人工智能 算法
一文搞懂模型量化算法基础
一文搞懂模型量化算法基础
4105 0
|
算法 C语言
C语言算法基础-在一个单链表中值为y的结点前面插入一个值为x的结点
题目:3.4设计一个算法,在一个单链表中值为y的结点前面插入一个值为x的结点。即使值为x的新结点成为值为y的结点的前驱结点。 题目来自李云清版《数据结构》
322 5
C语言算法基础-在一个单链表中值为y的结点前面插入一个值为x的结点
|
算法 C语言
C语言算法基础-求单链表中带头结点的结点个数
题目:3.2 设计一个算法,求一个单链表中的结点个数。 来源李云清版《数据结构》
227 3
C语言算法基础-求单链表中带头结点的结点个数
|
算法 API
算法基础学习2——冒泡排序
要比较的每一对元素是相邻的,从下标为0开始,到最后一个元素,如果下标设为 j,则相邻元素下标值为 j +1,搜索到最后一个元素:j+1<a.length,而 a.length - 1 = i ;所以终止条件是 j < i
132 0
算法基础学习2——冒泡排序
|
机器学习/深度学习 算法 Java
算法基础学习1——时间复杂度和空间复杂度
算法基础学习1——时间复杂度和空间复杂度
126 0
算法基础学习1——时间复杂度和空间复杂度
|
搜索推荐 Java
Java基础数组-冒泡排序算法
Java基础数组-冒泡排序算法
Java基础数组-冒泡排序算法
|
存储 编解码 算法
【算法基础】希尔排序解析
希尔排序的基本思想是先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录"基本有序"时,再对全体记录进行依次直接插入排序。
116 0
|
编解码 算法 网络协议
【算法基础】冒泡排序解析
在我们数组排序中,每一个数组元素根据大小比对,小的元素不断向前移动,如同气泡在冒出一样,我们称这种排序方法为冒泡排序。
174 0
|
机器学习/深度学习 编解码 算法
【算法基础】归并排序解析
归并排序是建立在归并操作上的一种有效,稳定的排序算法,它是采用分治法的一个非常典型的应用。将待排序数组分为两条线逐级拆分,将子序列进行排序,然后沿两条线逐级合并,得到完全有序序列。这种通过递归,层层合并的方法,称为归并。
171 0
|
存储 算法
算法基础
递归算法在计算机系统中用栈帮助实现,一般常见的算法有深度优先遍历(DFS),可以解决的问题有迷宫问题是否连通的问题,递推会对应一个递归搜索树,递归搜索树可以帮助我们更好的理解递归的流程,递归要注意的有是否可以进行剪枝,在迷宫问题中,也要考虑是否要保存原有的迷宫。
210 0
算法基础