同步操作将从 dearHaoGeGe/Ebooks 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
程序分析
关键是计算出每一项的值,然后将各个值相加得出所需的结果。
编写代码
package com.jingxuan.system;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Sumloop {
public static void main(String[] args) throws IOException {
int s = 0;
String output = "";
BufferedReader stadin = new BufferedReader(new InputStreamReader(System.in));
System.out.print("请输入a的值:");
String input = stadin.readLine();
for (int i = 1; i <= Integer.parseInt(input); i++) {
output += input;
int a = Integer.parseInt(output);
s += a;
System.out.println(output);
}
System.out.println("s=a+aa+aaa+aaaa+aa...a的值为:" + s);
}
}
执行结果
请输入a的值:6
6
66
666
6666
66666
666666
s=a+aa+aaa+aaaa+aa...a的值为:740736
二叉树是指每个结点最多有两个子树的有序树。
通常子树的根被称作“左子树”(left subtree)和“右子树”(right subtree)。
二叉树常被用作二叉查找树和二叉堆。
二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。
二叉树的第i层至多有2的(i-1)次方个结点;深度为k的二叉树至多有2^(k) -1个结点;对任何一棵二叉树T,如果其终端结点数(即叶子结点数)为n0,度为2的结点数为n2,则n0 = n2 + 1。
数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关。
数据结构(data structure)是带有结构特性的数据元素的集合,它研究的是数据的逻辑结构和数据的物理结构以及它们之间的相互关系,并对这种结构定义相适应的运算,设计出相应的算法,并确保经过这些运算以后所得到的新结构仍保持原来的结构类型。
简而言之,数据结构是相互之间存在一种或多种特定关系的数据元素的集合,即带“结构”的数据元素的集合。“结构”就是指数据元素之间存在的关系,分为逻辑结构和存储结构。
数据的逻辑结构和物理结构是数据结构的两个密切相关的方面,同一逻辑结构可以对应不同的存储结构。算法的设计取决于数据的逻辑结构,而算法的实现依赖于指定的存储结构。
数据结构的研究内容是构造复杂软件系统的基础,它的核心技术是分解与抽象。
通过分解可以划分出数据的3个层次;再通过抽象,舍弃数据元素的具体内容,就得到逻辑结构。类似地,通过分解将处理要求划分成各种功能,再通过抽象舍弃实现细节,就得到运算的定义。
上述两个方面的结合可以将问题变换为数据结构。这是一个从具体(即具体问题)到抽象(即数据结构)的过程。
然后,通过增加对实现细节的考虑进一步得到存储结构和实现运算,从而完成设计任务。这是一个从抽象(即数据结构)到具体(即具体实现)的过程。
解题思路
假设一组数[ 13 14 94 33 82 25 59 94 65 23 45 27 73 25 39 10 ],如果以步长为5开始进行排序,可以将这列表放在有5列的表中来更好地描述算法,这样他们就应该看起来是这样(竖着的元素是步长组成):
13 14 94 33 82
25 59 94 65 23
45 27 73 25 39
10
然后对每列进行排序:
10 14 73 25 23
13 27 94 33 39
25 59 94 65 82
45
将上述四行数字,依序接在一起时得到:[ 10 14 73 25 23 13 27 94 33 39 25 59 94 65 82 45 ]。这时10已经移至正确位置,然后再以3为步长进行排序:
10 14 73
25 23 13
27 94 33
39 25 59
94 65 82
45
排序之后变为:
10 14 13
25 23 33
27 25 59
39 65 73
45 94 82
94
最后以1步长进行排序,此时就是简单的插入排序。
程序代码
Java中实现希尔排序算法代码如下:
package com.jingxuan.system;
import java.util.Arrays;
public class ShellSort {
public static void main(String[] args) {
int[] num = { 7, 6, 9, 3, 1, 5, 2, 4 };
System.out.println("未排序的数组:" + Arrays.toString(num));
// 增量序列的选择没有具体的公式,可以根据自己的数据取个合适的增量序列
for (int increment = num.length / 2; increment > 0; increment = increment / 2) {
// 根据增量对数组进行分组
for (int i = increment; i < num.length; i++) {
int index = i;
// 进行插入排序
// 注意:index-increment值的变化
while ((index - increment) >= 0 && num[index] < num[index - increment]) {
int temp = num[index];
num[index] = num[index - increment];
num[index - increment] = temp;
index = index - increment;
}
}
}
System.out.println("排序后的数组:" + Arrays.toString(num));
}
}
运行结果
未排序的数组:[7, 6, 9, 3, 1, 5, 2, 4]
排序后的数组:[1, 2, 3, 4, 5, 6, 7, 9]
二分法查找(Binary Search)也称折半查找,是指当每次查询时,将数据分为前后两部分,再用中值和待搜索的值进行比较,如果搜索的值大于中值,则使用同样的方式(二分法)向后搜索,反之则向前搜索,直到搜索结束为止。
二分法使用的时候需要注意:二分法只适用于有序的数据,也就是说,数据必须是从小到大,或是从大到小排序的。
程序代码
package com.jingxuan.system;
public class Sphere {
public static void main(String[] args) {
double s = 0;
double t = 100;
for (int i = 1; i <= 10; i++) {
s += t;
t = t / 2;
}
System.out.println("第10次落地时,共经过" +s+ "米");
System.out.println("第10次反弹" +t+ "米");
}
}
执行结果
第10次落地时,共经过199.8046875米
第10次反弹0.09765625米
时间复杂度
1)最坏情况查找最后一个元素(或者第一个元素)Master定理T(n)=T(n/2)+O(1)所以T(n)=O(logn)。
2)最好情况查找中间元素O(1)查找的元素即为中间元素(奇数长度数列的正中间,偶数长度数列的中间靠左的元素)。
空间复杂度
S(n)=n
分析
在有序的N个元素的数组中查找输进去的数据x值。算法如下:
1)确定查找范围front=0,end=N-1,计算中项mid=(front+end)/2。
2)若a[mid]=x或front>=end,则结束查找;否则,向下继续。
3)若a[mid]<x,说明待查找的元素值只可能在比中项元素大的范围内,则把mid+1的值赋给front,并重新计算mid,转去执行步骤2;若a[mid]>x,说明待查找的元素值只可能在比中项元素小的范围内,则把mid-1的值赋给end,并重新计算mid,转去执行步骤2。
实例
package com.jingxuan.system;
public class BinarySearch {
public static void main(String[] args) {
// 二分法查找
int[] binaryNums = { 1, 6, 15, 18, 27, 50 };
int findValue = 27; // 查找27值
int binaryResult = binarySearch(binaryNums, 0, binaryNums.length - 1, findValue);
System.out.println("元素第一次出现的位置(索引从0开始):" + binaryResult);
}
/**
* 二分查找,返回该值第一次出现的位置(下标从 0 开始)
*
* @param nums 查询数组
* @param start 开始下标
* @param end 结束下标
* @param findValue 要查找的值
* @return int
*/
private static int binarySearch(int[] nums, int start, int end, int findValue) {
if (start <= end) {
// 中间位置
int middle = (start + end) / 2;
// 中间的值
int middleValue = nums[middle];
if (findValue == middleValue) {
// 等于中值直接返回
return middle;
} else if (findValue < middleValue) {
// 小于中值,在中值之前的数据中查找
return binarySearch(nums, start, middle - 1, findValue);
} else {
// 大于中值,在中值之后的数据中查找
return binarySearch(nums, middle + 1, end, findValue);
}
}
return -1;
}
}
执行结果如下:
元素第一次出现的位置(索引从0开始):4
程序分析:循环遍历从后往前取数组长度减1作为数的索引值,然后输出其数据。
程序代码如下:
package com.jingxuan.system;
public class ArraysReverse {
public static void main(String[] args) {
int[] n = { 61, 62, 21, 34, 25, 82 };
System.out.println("数组逆序输出为");
for (int i = n.length; i > 0; i--) {
System.out.print(n[i-1] + " ");
}
}
}
运行结果如下:
数组逆序输出为
82 25 34 21 62 61
程序分析:利用数轴来分界,定位。注意定义时需把奖金定义成长整型。
程序代码如下:
package com.yoodb.util;
import java.util.Scanner;
public class Demo02 {
private static Scanner s;
public static void main(String[] args) {
s = new Scanner(System.in);
System.out.print("请输入该月的利润:(万元)");
int I = s.nextInt();
long sum = 0;
if (I <= 100000) {
sum = I / 100 * 10;
} else if (I < 200000) {
sum = (long) (100000 / 100 * 10 + (I - 100000) / 100 * 7.5);
} else if (I < 400000) {
sum = (long) (100000 / 100 * 10 + 100000 / 100 * 7.5 + (I - 200000) / 100 * 5);
} else if (I < 600000) {
sum = (long) (100000 / 100 * 10 + 100000 / 100 * 7.5 + 200000 / 100 * 5 + (I - 400000) / 100 * 3);
} else if (I < 1000000) {
sum = (long) (100000 / 100 * 10 + 100000 / 100 * 7.5 + 200000 / 100 * 5 + 200000 / 100 * 3
+ (I - 600000) / 100 * 1.5);
} else {
sum = (long) (100000 / 100 * 10 + 100000 / 100 * 7.5 + 200000 / 100 * 5 + 200000 / 100 * 3
+ 400000 / 100 * 1.5 + (I - 1000000) / 100);
}
System.out.println("该月发放的奖金为:" + sum);
}
}
运行结果如下:
请输入该月的利润:(万元)120
该月发放的奖金为:10
所谓水仙花数是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个水仙花数,因为153=1的三次方+5的三次方+3的三次方。
程序分析:
利用for循环控制100-999个数,每个数分解出个位,十位,百位。
程序代码
public class Demo02 {
public static void main(String args[]) {
for (int i = 100; i <= 999; i++)
if (shuixianhua(i) == true)
System.out.println(i + " ");
}
public static boolean shuixianhua(int x) {
int i = 0, j = 0, k = 0;
i = x / 100;
j = (x % 100) / 10;
k = x % 10;
if (x == i * i * i + j * j * j + k * k * k)
return true;
else
return false;
}
}
运行结果
153 370 371 407
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。