java常见编程练习hw一(入门、简单题型)
文章目录
- 1. 二进制中1的个数
- 思路1: 输入的整数与1做位与运算
- [推荐掌握]思路2:n&(n-1)
- 2. 最小公倍数
- 思路1: 最小公倍数 = 两数相乘/最大公约数
- 3. 字符逆序
- 思路1: StringBuilder.reverse方法
- 4. 等差数列
- 思路:数学思路,转化为等差数列求和,直接用公式计算求解
- 5. 求最大连续bit数
- 思路: 位运算,利用>>运算符,循环判断是否有连续的1。
- [简单、推荐]思路:先转换成二进制字符串,然后以“0”对其进行分割成字符串数组
- 6. 最长回文子串(TODO)
- 7. 字符串反转
- 思路:利用 StringBuffer 或 StringBuilder 的 reverse 成员方法
- 思路2: 利用 String 的 toCharArray 方法先将字符串转化为 char 类型数组,然后将各个字符进行重新拼接
- 8. 数字颠倒
- 【简单直接】思路:转换成字符串、然后直接利用StringBuilder 的 reverse 成员方法
- 9. 表达式求值(TODO)
- 10. 统计大写字母个数
- 【该方法简单、推荐】思路1: 利用charAt取出单个字符判断 a >= 'A' && a <= 'Z'r
- 11. 根据输入的日期,计算是这一年的第几天
- 思路1
- 尼科彻斯定理(TODO)
- 统计每个月兔子的总数
- 思路1: 兔子分为3类:1个月的兔子,2个月的兔子,以及>=3个月的兔子
1. 二进制中1的个数
二进制中1的个数
参考URL: https://blog.51cto.com/12951882/2044547
思路1: 输入的整数与1做位与运算
首先我们应该判断整数二进制表中最右边的一位是不是1,接着把输入的整数右移一位,此时原来处于右边倒数第二为被移到最右边了,再判断是不是1,。这样每次移动一位,直到整个整数变成0为止。
思路1:我们把输入的整数与1做位与运算,如果一个整数与1做与运算结果是1,表示该整数最右边一位是1,否则是0.
虽然把整数右移一位和把整数除以2在数学上是等价的,但是因为除法的运算效率比移位运算要低的多,在实际应用中尽可能低运用移位运算代替乘除法运算。
public static void main(String[] arg) {Scanner sc = new Scanner(System.in);int num = sc.nextInt();int count = 0;while (num > 0) {if ((num & 1) == 1) {++count;}num >>= 1;}System.out.println(count);}
应用这种方法有可能会导致死循环,如果输入一个负数,最高位为1,移位前是个负数,仍要保证移位后也是负数,因此移位后的最高为会设为1.如果一直做右移运算,最终会变为0xfffff而陷入死循环。
如果输入的正整数可以,可以用这个方法。
[推荐掌握]思路2:n&(n-1)
时间复杂度 O(logM)O(\log_{}{M} )O(logM) ,其中 M 表示 1 的个数。
思路: 一个数与该数减一的结果进行与运算n&(n-1),会把该数右边(低位)第一个1变为0,而该位左边保持不变(高位)
n&(n-1)作用:将n的二进制表示中的最低位为1的改为0.
例子:比如1100(对应十进制是12),减去1之后的结果是1011(也就是十进制的11),两个数进行与运算之后,我们发现最后的结果是1000(对应十进制的8,当然这个8与后面没有关系,可以略过)。这样我们每进行一次的与运算就消去一个1,这样消到最后肯定是0了,所以我们可以在代码中以这个为循环的终止条件。
public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();int count = 0;while(n != 0) {count ++;n = n & (n - 1);}System.out.println(count);scanner.close();}
2. 最小公倍数
最小公倍数(Least Common Multiple(LCM))
参考URL: https://www.cnblogs.com/echoing/p/7878954.html
算法笔记_042:求最小公倍数(Java)
参考URL: https://www.cnblogs.com/liuzhen1995/p/6423600.html
正整数A和正整数B 的最小公倍数是指 能被A和B整除的最小的正整数值,设计一个算法,求输入A和B的最小 公倍数。
两个或多个整数公有的倍数叫做它们的公倍数,其中除0以外最小的一个公倍数就叫做这几个整数的最小公倍数。整数a,b的最小公倍数记为[a,b],同样的,a,b,c的最小公倍数记为[a,b,c],多个整数的最小公倍数也有同样的记号。
与最小公倍数相对应的概念是最大公约数,a,b的最大公约数记为(a,b)。关于最小公倍数与最大公约数,我们有这样的定理:(a,b)[a,b]=ab(a,b均为整数)
思路1: 最小公倍数 = 两数相乘/最大公约数
求最大公约数有两种方法 更相减损法和辗转相处法 最小公倍数在求出最大公约数后 两个数相乘除以最大公约数就是最小公倍数
更相减损法:
更相减损法是拿两个数中的较大值减去较小值,然后在减数、被减数、差之间选取两个较小值继续相减,直到减数和被减数相等,得出的数就是最大公约数。
例://更相减损术:
//8 10
//10 - 8=2
//8 - 2= 6
//6-2=4
//4-2=2
//2==2于是最大公约数就是2
public static void main(String[] args){Scanner scanner = new Scanner(System.in);int int1 = scanner.nextInt();int int2 = scanner.nextInt();System.out.println( int1*int2/methods(int1,int2));}public static int methods(int int1, int int2){if(int1 == int2){return int1;} if(int1 > int2){int differ = int1 - int2;return methods(int2,differ);}else{int differ = int2- int1;return methods(int1,differ);}}
3. 字符逆序
将一个字符串str的内容颠倒过来,并输出。str的长度不超过100个字符。
输入描述:
输入一个字符串,可以有空格
输出描述:
输出逆序的字符串
思路1: StringBuilder.reverse方法
import java.util.*;public class Main {public static String reverse(String str) {StringBuilder res = new StringBuilder(str);return res.reverse().toString();}public static void main(String[] args){Scanner in = new Scanner(System.in);while (in.hasNextLine()) {String str = in.nextLine();String res = reverse(str);System.out.println(res);}}
}
4. 等差数列
题目描述
功能:等差数列 2,5,8,11,14。。。。
输入:正整数N >0
输出:求等差数列前N项和
本题为多组输入,请使用while(cin>>)等形式读取数据
输入描述:
输入一个正整数。
输出描述:
输出一个相加后的整数。
示例1
输入 2
输出 7
思路:数学思路,转化为等差数列求和,直接用公式计算求解
等差数列基础:
等差数列是常见数列的一种,可以用AP表示,如果一个数列从第二项起,每一项与它的前一项的差等于同一个常数,这个数列就叫做等差数列,而这个常数叫做等差数列的公差,公差常用字母d表示 [1] 。例如:1,3,5,7,9……(2n-1)。
等差数列{an}的通项公式为:an=a1+(n-1)d。
前n项和公式为:Sn=n*a1+n(n-1)d/2或Sn=n(a1+an)/2 。注意: 以上整数。
思路:等差数列求和公式
前n项和:Sn = (a1 + an)*n/2
第n项: an = a1 + (n - 1) * 3(公差);
根据题目中的 具体的 a1 和 n
把 a1 和 n 代进去,计算出来格式题目中 Sn = (1 + 3 * n) * n / 2
import java.util.Scanner;public class Main{public static void main(String[] args){Scanner sc = new Scanner(System.in);while(sc.hasNext()){int n = sc.nextInt();System.out.println((1 + 3 * n) * n / 2);}}
}
5. 求最大连续bit数
题目描述
求一个byte数字对应的二进制数字中1的最大连续数,例如3的二进制为00000011,最大连续2个1
本题含有多组样例输入。
输入描述:
输入一个byte数字
输出描述:
输出转成二进制之后连续1的个数
示例1
输入 3
输出 5
思路: 位运算,利用>>运算符,循环判断是否有连续的1。
求一个byte数字对应的二进制数字中1的最大连续数
参考URL: https://www.it610.com/article/1297183224455307264.htm
根据位运算,获取每一位的二进制值。获取第i位的值: (n >> i) & 1。如果1连续,则计数累加, 如果不连续,则从0开始计数。
总结: 一边右移一边统计,不断更新count和max。
[简单、推荐]思路:先转换成二进制字符串,然后以“0”对其进行分割成字符串数组
思路是先转换成二进制字符串,然后以“0”对其进行分割成字符串数组,
求数组中每项长度的最大值即为最大连续1的个数。
public static void main(String[] args) {Scanner sc = new Scanner(System.in);while (sc.hasNext()) {int in1 = sc.nextInt();int max = 0;String str = Integer.toBinaryString(in1);String[] stra = str.split("0");for (int i = 0; i < stra.length; i++) {max = max < stra[i].length() ? stra[i].length() : max;}System.out.println(max);}}
6. 最长回文子串(TODO)
最简便的找字符串中最长回文子串的方法是什么?
参考URL: https://www.zhihu.com/question/40965749
最长回文子串(Java版本)
参考URL: https://blog.csdn.net/tiankong_12345/article/details/102018257
Java算法练习——最长回文子串
参考URL: https://www.cnblogs.com/mxwbq/p/10938952.html
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
7. 字符串反转
接受一个只包含小写字母的字符串,然后输出该字符串反转后的字符串。(字符串长度不超过1000)
输入描述:
输入一行,为一个只包含小写字母的字符串。
输出描述:
输出该字符串反转后的字符串。
示例1
输入 abcd
输出 dcba
思路:利用 StringBuffer 或 StringBuilder 的 reverse 成员方法
Java实现字符串反转
参考URL: https://www.cnblogs.com/binye-typing/p/9260994.html
import java.util.*;
public class Main{public static void main(String[] args){Scanner sc=new Scanner(System.in);while(sc.hasNext()){String s=sc.next();StringBuffer sb = new StringBuffer(s);System.out.println(sb.reverse().toString()); }}
}
思路2: 利用 String 的 toCharArray 方法先将字符串转化为 char 类型数组,然后将各个字符进行重新拼接
Java实现字符串反转
参考URL: https://www.cnblogs.com/binye-typing/p/9260994.html
import java.util.*;
public class Main{public static void main(String[] args){Scanner sc=new Scanner(System.in);while(sc.hasNext()){String s=sc.next();char[] chars = s.toCharArray();String reverse = "";for(int i = chars.length - 1; i >= 0; i--){reverse += chars[i];}System.out.println(reverse); }}
}
8. 数字颠倒
题目描述
输入一个整数,将这个整数以字符串的形式逆序输出
程序不考虑负数的情况,若数字含有0,则逆序形式也含有0,如输入为100,则输出为001
【简单直接】思路:转换成字符串、然后直接利用StringBuilder 的 reverse 成员方法
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);while (in.hasNextInt()) {int a = in.nextInt();String b = String.valueOf(a);StringBuffer sb = new StringBuffer(b);System.out.println(sb.reverse().toString());}}
}
9. 表达式求值(TODO)
牛客网:表达式求值(Java实现)
参考URL: https://blog.csdn.net/u013053615/article/details/94380525
题目描述
给定一个字符串描述的算术表达式,计算出结果值。
输入字符串长度不超过100,合法的字符包括”+, -, *, /, (, )”,”0-9”,字符串内容的合法性及表达式语法的合法性由做题者检查。本题目只涉及整型计算。
输入
400+5
输出
405
10. 统计大写字母个数
题目描述
找出给定字符串中大写字符(即’A’-‘Z’)的个数。
【该方法简单、推荐】思路1: 利用charAt取出单个字符判断 a >= ‘A’ && a <= 'Z’r
public static void main(String[] args) {Scanner in = new Scanner(System.in);while (in.hasNext()) {String str = in.nextLine();int count = 0;for(int i=0; i<str.length();i++){char a = str.charAt(i);if(a >= 'A' && a <= 'Z'){++count;}}System.out.println(count);}}
注意:使用nextLine() 输入用例里面有 空格的字符串。
11. 根据输入的日期,计算是这一年的第几天
思路比较简单, 从这一年的开始一直加到这一天, 注意闰年二月是29天
注意: 闰年的二月份的天数为29天,如果日期是闰年且月份大于二月时,需要考虑加一天。
思路1
Java篇—根据输入的日期(年月日),输出这一年的第几天
参考URL: https://blog.csdn.net/weixin_43761659/article/details/96889620
step 1:判断输入日期的合法性,如果输入不合法返回-1;
step 2:根据输入的月份,计算从1月到(month - 1)月的天数,如果是二月的话,就要判断该年是否为闰年(闰年,day加29天,反之,day加28天);
step 3:根据步骤二计算出来的数值,最后加上输入的date,输出即可。
题目总结:题目的关键点在于二月的天数累加,即闰年判断。
易错点分析:在for循环结束之后,还要加上之前输入的date。
public static void main(String [] args){Scanner sc = new Scanner(System.in);while (sc.hasNext()) {int year = sc.nextInt();int month = sc.nextInt();int date = sc.nextInt();int day = 0;if (year <=0 || month <= 0 || month > 12 || date <= 0 || date > 31){System.out.println(-1);break;}for(int i=1; i<month; i++) {if(i==1 || i==3 || i==5 || i==7 || i==8 || i==10 || i==12) {day += 31;} else if(i==4 || i==6 || i==9 || i==11) {day += 30;} else if(i==2 && (year%400==0 || (year%4==0 && year%100!=0))) {day += 29;} else {day += 28;}}day += date;System.out.println(day);}sc.close();}
尼科彻斯定理(TODO)
题目描述
验证尼科彻斯定理,即:任何一个整数m的立方都可以写成m个连续奇数之和。
例如:
1^3=1
2^3=3+5
3^3=7+9+11
4^3=13+15+17+19
输入一个正整数m(m≤100),将m的立方写成m个连续奇数之和的形式输出。
输入描述:
输入一个int整数
输出描述:
输出分解后的string
统计每个月兔子的总数
有一只兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第三个月后每个月又生一只兔子,假如兔子都不死,问每个月的兔子总数为多少?
①兔子的初始数:一只刚出生的兔子
②兔子到第三个月的时候,就开始生兔宝宝,不是要等完全满3个月才生。
思路1: 兔子分为3类:1个月的兔子,2个月的兔子,以及>=3个月的兔子
所以只需要求出每个月这三类兔子的数目即可
根据题意可知兔子分为3类:1个月的兔子,2个月的兔子,以及>=3个月的兔子
所以只需要求出每个月这三类兔子的数目即可!
一个月大的兔子书数量 = 能生的兔子生的兔子数量
- 能生的兔子数量=前一个月能生的数量+前一个月是两个月大的兔子数量
- 两个月大的兔子数量 = 前一个月一个月大兔子数量
- 一个月大的兔子书数量 = 能生的兔子生的兔子数量
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner in =new Scanner(System.in);while(in.hasNext()){int month=in.nextInt();int nengsheng = 0;// 能生的兔子数量(三个月大)int yigeyueda = 1;// 一个月大的兔子数量int lianggeyueda = 0;// 两个月大的兔子数量int sum = 0;// 每个月的兔子数量总和for (int i = 1; i < month; i++) {nengsheng += lianggeyueda;// 能生的兔子数量=前一个月能生的数量+前一个月是两个月大的兔子数量lianggeyueda = yigeyueda;// 两个月大的兔子数量 = 前一个月一个月大兔子数量yigeyueda = nengsheng;// 一个月大的兔子书数量 = 能生的兔子生的兔子数量sum = nengsheng + yigeyueda + lianggeyueda;// 总数量}System.out.println(sum);}in.close();}}
java常见编程练习hw一(入门、简单题型)相关推荐
- java常见编程练习hw二(中等难度)
文章目录 1. 进制转换 [推荐.简单]思路:java内置 decode方法,将 String 解码为 Integer [不推荐]思路2,自己计算 2. 质数因子 思路1: 设定i=2,i一直递增,当 ...
- 学习笔记:Java 并发编程①_基础知识入门
若文章内容或图片失效,请留言反馈. 部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 视频链接:https://www.bilibili.com/video/av81461839 视频下载: ...
- Java网络编程案例--CS模型的简单实现
Java网络编程案例–CS模型的简单实现 Java网络编程案例CS模型的简单实现 基本概述 程序原理图 源代码 基本概述 该程序采用C/S模型,在服务器端简单的建立了一个多线程类,来实现对多个客户端传 ...
- java se 定时任务_Quartz 定时任务使用 —— 入门简单调用(一)
Quartz 详细介绍 Quartz是一个开源的作业调度框架,它完全由Java写成,并设计用于J2SE和J2EE应用中.它提供了巨大的灵 活性而不牺牲简单性.你能够用它来为执行一个作业而创建简单的或复 ...
- Java网络编程从0——》入门
目录: 1.软件结构 2. 网络编程三要素 3. TCP通信程序(Socket和ServerSocket) 1.软件结构 1.C/S结构:全称是Client/Server结构,是指客户端和服务器结构如 ...
- Java网络编程(一)- 一个简单的服务端/客户端应用程序
在Java中,我们使用java.net.Socket及其相关类来完成有关网络的相关功能.Socket类非常简单易用,因为Java技术隐藏了建立网络连接和通过连接发送数据的复杂过程.下面所说的内容只适用 ...
- 连接主机Java网络编程(一)- 一个简单的服务端/客户端应用程序
新手发帖,很多方面都是刚入门,有错误的地方请大家见谅,迎欢批评指正 在Java中,我们应用java.net.Socket及其关相类来成完有关络网的关相功能.Socket类非常简略易用,因为Java术技 ...
- 【Java 网络编程】TCP 服务器端 客户端 简单示例
文章目录 I IntelliJ IDEA 创建 Java 项目 II 客户端 Socket 创建 III Socket 客户端连接服务器端 IV Socket 两个端点信息获取 V 控制台人机交互 V ...
- java gui怎么做游戏_Java GUI编程之贪吃蛇游戏简单实现方法【附demo源码下载】
本文实例讲述了Java GUI编程之贪吃蛇游戏简单实现方法.分享给大家供大家参考,具体如下: 例子简单,界面简陋 请见谅 项目结构如下 Constant.jvava 代码如下: package sna ...
最新文章
- MySQL数据类型之数字类型详细解析
- Hyper-V Server 2008 R2 系统部署向导
- 5 关于数据仓库维度数据处理的方法探究系列——缓慢变化维处理——全历史记录...
- hdu4267线段树段更新,点查找,55棵线段树.
- 新书上架:《Java SE 实践教程》
- oracle底层执行顺序,select语句结构与执行顺序-Oracle
- 快速排序 java代码_java实现快速排序
- 2021年度训练联盟热身训练赛第四场,签到题CDF
- 渗透测试工具之——WVSS(绿盟web应用漏洞扫描系统)概述
- 图神经网络-论文精读-“A Gentle Introduction to Graph Neural Networks“
- 主分区、扩展分区、逻辑分区和活动分区的区别与联系
- 我转行程序员的那一年(八)
- Python 解析 spec 文件
- 工业镜头倍率及视场范围、焦距的计算方法
- sqlite3数据库文件损坏修复
- 2021-01-30关于IE浏览器被篡改主页无法修改的解决办法
- 小熊维尼项目冲刺 第二天
- 江苏省小学生计算机装备标准,江苏省小学信息技术装备标准new.doc
- 如何防止过拟合(overfitting)
- Idea一个Project有多个Module共存(类似于Eclipse下一个Workspace有多个Project)
热门文章
- 游戏编程资料合集(持续更新)
- 为什么我的 JavaScript 代码会收到“请求的资源上不存在 ‘Access-Control-Allow-Origin‘ 标头”错误,而 Postman 却没有?
- python习题:(调用函数)打印横线、计算数的和与平均值
- 搜索算法-深搜与广搜
- xml文件使用浏览器打开,提示“This page contains the following errors“解决办法
- 三大流派三次浪潮,人工智能60年沉浮史
- 蓝桥 Python 大于等于n的最小完全平方数
- 哈工大计算机系统实验六——高速缓冲器模拟
- 解决企业数字化“历史遗留问题”,低代码具备天然优势 | 专访腾讯云微搭骆勤
- 全球首个AI模型开发管理标准正式发布,九章云极DataCanvas公司助力AI工程化新发展