2021年1月做算法题记录(Java实现)

这个月练习了一些算法题,打算从简单题入手,逐步练习达到PAT甲级的程度,把Java和C++的熟练度捡回来。Java的一些基础知识还不是很熟,大一学习的时候只能算是囫囵吞枣,到了面试技术岗的时候才觉得当时真的是猴子捡香蕉式学习。希望在我大四毕业前可以把这些知识都融会贯通,可以在毕业后一年内找到满意的工作。

题源链接:https://wenku.baidu.com/view/4dafb43a00f69e3143323968011ca300a6c3f6a5.html

1.分解质因数

	//分解质因数
	int k = 2;
	public void myPrime(int n) {
		System.out.print("n = ");
		while(n > k) {
			
			if(n % k == 0) {    //找到因数
				
				System.out.printf(k+" * ");
				n /= k;    //类似递归的思路
				
			}else {
				
				k++;
				
			}
			
		}
		System.out.println(k);
		
	}

2.求完数

	//一个数如果恰好等于它的因子之和 这个数就称为"完数" 例如找出 1000 以内的所有完数。 
	public void perferctNum() {
		int sum = 0;
		int num = 0;
		for(int n = 1;n <= 1000;n++) {
			sum = 0;
			num = n;
			for(int i = 1;i <= n / 2;i++) {
				if(n % i == 0) {
					sum += i;
				}
			}
			if(num == sum) {
				System.out.println(num);
			}	
		}
		
	}

3.统计输入字符类型与计数

	//输入一行字符 分别统计出其中英文字母 空格 数字 和其它字符的个数。
	public void countString() {
		int engNum = 0;
		int kongNum = 0;
		int numNum = 0;
		int otherNum = 0;
		Scanner sc = new Scanner(System.in);
		String string = sc.nextLine();
		for(int i = 0;i < string.length();i++) {
			char c = string.charAt(i);
			if((c >= 'A') && (c <= 'Z')) {
				engNum++;
			}else if((c >= 'a') && (c <= 'z')){
				engNum++;
			}else if ((c >= '0') && (c <= '9')) {
				numNum++;
			}else if (c==' ') {
				kongNum++;
			}else {
				otherNum++;
			}
		}
		System.out.println("字母" + engNum + ";数字 = " + numNum + ";空格 = " + kongNum 
				+ ";其他 = " + otherNum);
		sc.close();
	}

4.求s=a+aa+aaa+aaaa+aa...a的值

	//求s=a+aa+aaa+aaaa+aa...a的值
	public long getNum(int a,int n) {
		
		int num = 0;
		for(int i = n-1 ;i >= 0;i--) {
			
			num += Math.pow(10, i) * a;
			
		}
		return num;
		
	}
	public void getSum(int a,int n) {
		int sum = 0;
		for(int i = 1;i <= n;i++) {
			sum += getNum(a, i);
		}
		System.out.println(sum);
	}

5. 第10次反弹多高?

	//一球从一百米高度自由落下 每次落地后反跳回原高度的一半
	//再落下 求它在第十次落地时 共经过多少米 第10次反弹多高?
	public void getHeight(int n) {
		double h = 100;    //初次高度
		double sum = 100;    //总高度的初始值
		double fan = 0;    //每次反弹高度
		for(int i = 1; i <= n; i++) {
			sum += fan * 2;
			fan = h / 2;
			h /= 2;
		}
		System.out.println("sum = "+sum+"fan = "+fan);
		
	}

6.求符合条件的数

	//1个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问
	boolean isPinfang(int n) {    //判断是否是完全平方数
		if(Math.sqrt(n) % 1 == 0) {
			return true;
		}
		return false;
	}
	public void getPin() {
		for(int i = 0;i < 10000000;i++) {
			if(isPinfang(i+100)&&isPinfang(i+268)) {
				System.out.println(i);
			}
		}
	}

7,输入某年某月某日 判断是这一年第几天

	//输入某年某月某日 判断是这一年第几天
    //初始化
	int[] mday1 = {31,28,31,30,31,30,31,31
					,30,31,30,31};
	int[] mday2 = {31,29,31,30,31,30,31,31
					,30,31,30,31};
	int[] sum = new int[12];
	//判断闰年
	public boolean isRun(int yy) {
		if(((yy % 4 == 0) && (yy % 100 != 0))
				||(yy % 400 == 0)) {
			return true;
		}
		return false;
	}
    //sum[i]所求月份之前的总和天数
	public void initMonth(int yy) {
		if(isRun(yy)) {
			for (int i = 0; i < 12; i++) {
				for(int j = i; j >= 0; j--) {
					sum[i] += mday2[j];
				}
			}
		}else {
			for (int i = 0; i < 12; i++) {
				for(int j = i; j >= 0; j--) {
					sum[i] += mday1[j];
				}
			}
		}
	}
	public void whichDay(int yy,int mm,int dd) {
		initMonth(yy);
		int ans = sum[mm-2] + dd;    //因为月份是1开头,sum是0开头,且要算包含(mm-1)月的天数
		System.out.printf("今天是%d年的第%d天\n",yy,ans);
		
	}

8.逆序输出数组(原地实现)

	public void reverse(int[] a) {
		 for (int i = 0, j = a.length - 1; i < j; ++i, --j) {
			 a[i] ^= a[j];
			 a[j] ^= a[i];
			 a[i] ^= a[j];
		 }
	}

9.猴子吃桃

	//猴子吃桃
	//猴子第一天摘下若干个桃子 当即吃了一半 还不瘾 又多吃了一个
	//第二天早上又将剩下的桃子吃掉一半又多吃了一个 
	//以后每天早上都吃了前一天剩下的一半零一个 
	//到第十天早上想再吃时 见只剩下一个桃子了 求第一天共摘了多少。
	/**
	 * b1=1 b2=2b1+2 b3=2b2+2....
	 */
	public int peach(int n) {
		if(n == 1) {
			return 1;
		}else {
			return (2*peach(n-1))+2;
		}
	}
	public void monkey() {
		System.out.println(peach(11));
	}

10.给出1,2,3,4四个数字,求出一共有几个互不相同,且无重复的三位数

public class Test27 {
	static int count = 0;
	int m = 4;
	int n = 3;
	int[] htable = new int[m+1];
	Stack<Integer> stack = new Stack<Integer>();
	//给出1,2,3,4四个数字,求出一共有几个互不相同,且无重复的三位数
	public void FNum(int now) {
		if(now == n) {
			count++;
			for (int is : stack) {
				System.out.print(is);
			}
			System.out.print(";");
			//System.out.println(stack);
			return;
		}
		for(int i = 1; i <= m; i++) {
			if(htable[i] == 0) {
				stack.push(i);
				htable[i]++;
				FNum(now+1);
				stack.pop();
				htable[i]--;
			}

		}
	}
	public static void main(String[] args) {
		Test27 test27 = new Test27();
		test27.FNum(0);
		System.out.println("\n共有"+count+"个互不相同且无重复数字的三位数");
	}

}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值