文章目录

  • 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(log⁡M)O(\log_{}{M} )O(log​M) ,其中 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一(入门、简单题型)相关推荐

  1. java常见编程练习hw二(中等难度)

    文章目录 1. 进制转换 [推荐.简单]思路:java内置 decode方法,将 String 解码为 Integer [不推荐]思路2,自己计算 2. 质数因子 思路1: 设定i=2,i一直递增,当 ...

  2. 学习笔记:Java 并发编程①_基础知识入门

    若文章内容或图片失效,请留言反馈. 部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 视频链接:https://www.bilibili.com/video/av81461839 视频下载: ...

  3. Java网络编程案例--CS模型的简单实现

    Java网络编程案例–CS模型的简单实现 Java网络编程案例CS模型的简单实现 基本概述 程序原理图 源代码 基本概述 该程序采用C/S模型,在服务器端简单的建立了一个多线程类,来实现对多个客户端传 ...

  4. java se 定时任务_Quartz 定时任务使用 —— 入门简单调用(一)

    Quartz 详细介绍 Quartz是一个开源的作业调度框架,它完全由Java写成,并设计用于J2SE和J2EE应用中.它提供了巨大的灵 活性而不牺牲简单性.你能够用它来为执行一个作业而创建简单的或复 ...

  5. Java网络编程从0——》入门

    目录: 1.软件结构 2. 网络编程三要素 3. TCP通信程序(Socket和ServerSocket) 1.软件结构 1.C/S结构:全称是Client/Server结构,是指客户端和服务器结构如 ...

  6. Java网络编程(一)- 一个简单的服务端/客户端应用程序

    在Java中,我们使用java.net.Socket及其相关类来完成有关网络的相关功能.Socket类非常简单易用,因为Java技术隐藏了建立网络连接和通过连接发送数据的复杂过程.下面所说的内容只适用 ...

  7. 连接主机Java网络编程(一)- 一个简单的服务端/客户端应用程序

    新手发帖,很多方面都是刚入门,有错误的地方请大家见谅,迎欢批评指正 在Java中,我们应用java.net.Socket及其关相类来成完有关络网的关相功能.Socket类非常简略易用,因为Java术技 ...

  8. 【Java 网络编程】TCP 服务器端 客户端 简单示例

    文章目录 I IntelliJ IDEA 创建 Java 项目 II 客户端 Socket 创建 III Socket 客户端连接服务器端 IV Socket 两个端点信息获取 V 控制台人机交互 V ...

  9. java gui怎么做游戏_Java GUI编程之贪吃蛇游戏简单实现方法【附demo源码下载】

    本文实例讲述了Java GUI编程之贪吃蛇游戏简单实现方法.分享给大家供大家参考,具体如下: 例子简单,界面简陋 请见谅 项目结构如下 Constant.jvava 代码如下: package sna ...

最新文章

  1. MySQL数据类型之数字类型详细解析
  2. Hyper-V Server 2008 R2 系统部署向导
  3. 5 关于数据仓库维度数据处理的方法探究系列——缓慢变化维处理——全历史记录...
  4. hdu4267线段树段更新,点查找,55棵线段树.
  5. 新书上架:《Java SE 实践教程》
  6. oracle底层执行顺序,select语句结构与执行顺序-Oracle
  7. 快速排序 java代码_java实现快速排序
  8. 2021年度训练联盟热身训练赛第四场,签到题CDF
  9. 渗透测试工具之——WVSS(绿盟web应用漏洞扫描系统)概述
  10. 图神经网络-论文精读-“A Gentle Introduction to Graph Neural Networks“
  11. 主分区、扩展分区、逻辑分区和活动分区的区别与联系
  12. 我转行程序员的那一年(八)
  13. Python 解析 spec 文件
  14. 工业镜头倍率及视场范围、焦距的计算方法
  15. sqlite3数据库文件损坏修复
  16. 2021-01-30关于IE浏览器被篡改主页无法修改的解决办法
  17. 小熊维尼项目冲刺 第二天
  18. 江苏省小学生计算机装备标准,江苏省小学信息技术装备标准new.doc
  19. 如何防止过拟合(overfitting)
  20. Idea一个Project有多个Module共存(类似于Eclipse下一个Workspace有多个Project)

热门文章

  1. 游戏编程资料合集(持续更新)
  2. 为什么我的 JavaScript 代码会收到“请求的资源上不存在 ‘Access-Control-Allow-Origin‘ 标头”错误,而 Postman 却没有?
  3. python习题:(调用函数)打印横线、计算数的和与平均值
  4. 搜索算法-深搜与广搜
  5. xml文件使用浏览器打开,提示“This page contains the following errors“解决办法
  6. 三大流派三次浪潮,人工智能60年沉浮史
  7. 蓝桥 Python 大于等于n的最小完全平方数
  8. 哈工大计算机系统实验六——高速缓冲器模拟
  9. 解决企业数字化“历史遗留问题”,低代码具备天然优势 | 专访腾讯云微搭骆勤
  10. 全球首个AI模型开发管理标准正式发布,九章云极DataCanvas公司助力AI工程化新发展