前言
本文的目的旨在通过练习,提高逻辑思维能力,和算法优化能力。
31.杨辉三角
题目:打印出杨辉三角形 ,完美杨辉三角。import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
System.out.println("请输入要画的层数:");
int n = in.nextInt();
for(int i=1;i<=n;i++) {
for(int j=n-i;j>=0;j--)
System.out.print(" ");
for(int k : yanghui(i))
System.out.printf("%4d",k);
System.out.println();
}
in.close();
}
public static int[] yanghui(int n) {
if(n==1) return new int[] {1};
else if(n==2) return new int[] {1,1};
else{
int[] a=new int[n];
a[0]=1;a[n-1]=1;
for(int i=1;i<n-1;i++) {
a[i]=yanghui(n-1)[i-1]+yanghui(n-1)[i];
}
return a;
}
}
}
32.找数组最大最小值
题目:输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。因为要两次交换,书写一个交换函数import java.util.Arrays;
public class Main {
public static void swap(int[] a,int i,int j) {//传入数组引用变量能够直接对数组进行修改
int temp=0;
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] a= {2,3,4,6,7,-20,-7,9,-10};
int max=a[0];
int min=a[0];
for(int i=0;i<a.length;i++) {
if(a[i]>max) max=a[i];//找出最大值
if(a[i]<min) min=a[i];//找出最小值
}
for(int i=0;i<a.length;i++) {
if(a[i]==max) swap(a,i,0);//最大数放首位
if(a[i]==min) swap(a,i,a.length-1);//最小数放末尾
}
System.out.print(Arrays.toString(a));
}
}
33.两数之和
题目:给出一个整数数组,请在数组中找出两个加起来等于目标值的数, 你给出的函数twoSum 需要返回这两个数字的下标(index1,index2),需要满足 index1 小于index2.。注意:下标是从1开始的 假设给出的数组中只存在唯一解 例如: 给出的数组为 {20, 70, 110, 150},目标值为90 输出 index1=1, index2=2方法一:for循环
public class Main {
public static int[] twoSum (int[] a, int b) {
for(int i=0;i<a.length-1;i++)
for(int j=i+1;j<a.length;j++)
if(a[j]==b-a[i]) {
return new int[] {i+1,j+1};
}
throw new RuntimeException("不存在");
}
public static void main(String[] args) {
int[] number= {3,2,7};
int[] b= twoSum(number,6);
System.out.print(Arrays.toString(b));
}
}
方法二:映射、哈希表
原理:将数组中数依次放入哈希表,判断目标值与现有值之差是否在哈希表中,本质思维一致,算法上由于HashMap底层数据结构是数组+链表+红黑树组成,查找是使用红黑树结构更快捷。由于Map方法中键值唯一,value不唯一,只有根据键值取数,没有办法根据数取键值,因此要将数组元素作为键值,数组下表作为值。
import java.util.*;
public class Solution {
public static int[] twoSum (int[] nums,int target) {
Map<Integer, Integer> m = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
if (m.get(target - nums[i])!=null) {//如果能在哈希表中找到目标值与num[i]的差,循环停止
return new int[]{m.get(target - nums[i]), i+1};
}
m.put(nums[i], i+1);
}
throw new RuntimeException("不存在");
}
public static void main(String[] args) {
int[] number= {3,2,4,6,7,5};
int[] b= twoSum(number,11);
System.out.print(Arrays.toString(b)); //toString方法先把b中元素变成String型,然后打包成数组
}
}
34、调换数字位置
题目:有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数
import java.util.Arrays;
import java.util.Scanner;
public class Main {
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
int[] a= {2,3,4,6,7,-20,-7,9,-10};
System.out.println(Arrays.toString(a));
System.out.println("请输入需要调整的数位:");
int m =in.nextInt();
int[] c=new int[m];
for(int i=0;i<m;i++)//取出后m个数
c[i]=a[a.length-m+i];
for(int i=a.length-m-1;i>=0;i--)//a中元素后移m位,从最后一个开始
a[i+m]=a[i];
for(int i=0;i<m;i++)//将取出的数重新放回
a[i]=c[i];
System.out.print(Arrays.toString(a));
in.close();
}
}
35、闭环报数
题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位,约瑟夫闭环问题
import java.util.Scanner;
/**
* @param total 代表参与总人数
* @param num 表示报数最大值
*/
public class Yuesefu {
public static void yuesefu(int total,int num) {
int[] a=new int[total];
int count=0;//计数
//初始化数组
for(int i=0;i<a.length;i++)
a[i]=i+1;
//
for(int i=0;i<a.length;i++) {
if(a[i]!=0)
count++;
if(count%3==0 && a[i]!=0) {
System.out.printf("第%d号选手出局\n", a[i]);
a[i]=0;
total--;
}
if(i==a.length-1)//数组到头了,重新循环
i=-1;
if(total==1)
break;
}
for(int k: a) {
if(k!=0)
System.out.print("最后剩下的人是:"+k+"号");
}
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("请输入参与人数:");
int total=in.nextInt();
System.out.println("报数大小:");
int num=in.nextInt();
yuesefu(total,num);
in.close();
}
}
36、字符串长度
题目:写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
System.out.println("请输入一个字符串:");
Scanner in = new Scanner(System.in);
String s = in.nextLine();
int length=stringLength(s);
System.out.print(length);
in.close();
}
private static int stringLength(String s) {//
String[] a = s.split("");
return a.length;
}
}
37、分奇偶求和函数
题目:编写一个函数,输入n为偶数时,调用函数求1/2+1/4+…+1/n,当输入n为奇数时,调用函数1/1+1/3+…+1/n
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("请输入一个正整数:");
int n = in.nextInt();
System.out.printf("和为%.4f",sum(n));
in.close();
}
public static double sum(int n) {
double result=0;
if(n==0) result=0;
else if(n%2==0) {
for(int i=2;i<=n;i+=2)
result+=1.0/i;
}
else {
for(int i=1;i<=n;i+=2)
result+=1.0/i;
}
return result;
}
38、字典序
题目:字符串排序。 分析:字符串的比较可以用字符串的compareTo函数,通过冒泡排序法排序public class Main {
public static void main(String[] args) {
String[] s = new String[]{"asd","bbb","dddd","add","eddd","ccdd","caaa","adds","cvf","dass"};
sort(s);
for(String k : s)
System.out.print(" "+k);
}
public static void sort(String[] s) {
for(int i=0;i<s.length-1;i++) {
for(int j=i+1;j<s.length;j++)
if(s[i].compareTo(s[j])>0) {
String temp="";
temp=s[i];
s[i]=s[j];
s[j]=temp;
}
}
}
}
39、猴子分桃
题目:海滩上有一堆桃子,五只猴子来分。第一只猴子把这堆桃子凭据分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份,第三、第四、第五只猴子都是这样做的,问海滩上原来最少有多少个桃子?
分析:找一个数是5n+1形式,且能经过至少5个人这么分
public class Main {
public static void main(String[] args) {
double i=1;
while(!sum(i)) {
i=i+5;
}
System.out.print("最小数为"+i);
}
public static boolean sum(double n) {
int count=0;
while(n%5==1) {
count++;
n=(n-1.0)*0.8;
}
if(count>=5)
return true;
else
return false;
}
}
40、反转链表
题目:输入一个链表,反转链表后,输出新链表的表头。
分析:构建一个新链表,从末尾依次加数,每次新加的数作为头结点。
public ListNode ReverseList(ListNode head) {
if(head.next==null) {//判断链表是否为空
return head;
}
else {
ListNode newhead=null;//新建一个头结点
ListNode temp=null;//临时变量
while(head!=null) {//从原链表取数放入新链表
temp=head.next;//保存下一个访问节点
head.next=newhead;//跟在head后面,可以使得新加入的值为头结点
newhead=head;//取出当前值
head=temp;//指针后移
}
return newhead;
}