Java基础知识-不会的 day07-练习、ASCII编码、逆序、排序

1.for循环的“末尾循环体"可以不是i++,可以每次增长2或者其它数
  for(int i=1;i<100;i+=2){}
2.java语言中乘除和取余先运行哪个?强制类型转换和乘除先运行哪个?
   %和*/优先级是相同的。 从左往右运行。强制类型转换先运行,乘除后运行。
   eg. x=2.5,y=4.7,a=7
        从左到右依次运算
       %和*/优先级是相同的。 
       t=x+a%3*(int)(x+y)%2/4
       =2.5+7%3*(int)(2.5+4.7)%2/4
       =2.5+1*(int)7.2%2/4   
       =2.5+7%2/4
       =2.5+1/4
       =2.5+0
       =2.5
如果t是浮点型, 那么结果就是2.5  如果t是整数类型,那么结果就是2
3.如何取3位数字的个十百位数
  eg.bai = i/100;
     shi = i/10%10;
     ge = i%10;
4.ASCII编码表历史及要点
  人为规定,字母a对应十进制数97,大写字母A对应十进制65。
  数字0-9对应ASCII编码十进制为48-57,字母a-z对应ASCII编码十进制为97-122,字母A-Z对应ASCII编码十进制为65-90。(我理解:因为美国人先写大写字母,所有大写字母的ASCII编码数字靠前)
   有了ASCII码表后,各国做自己的码表,中国从GB2312-->GBK,后来国际标准化组织,弄了一个万国码Unicode.


5.char 和int类型互转,char2个字节,int4个字节。
   char存储的时候,就是存的char变量
  char转化成int时,先变成对应ASCII值,再运算。
   char a = 'a';
   System.out.println(a); // 输出a
   int i = a+1;
   System.out.println(i); // 输出98


6.char存储汉字,查询unicode编码表
7.char可以和int计算,提升为int类型,
  char的取值范围是0-65535
  
  short也是2个字节,取值范围 -32768 - 32767,二进制最高位是符号位,1是负数,0是正数。
  char类型二进制,全是数值,没有符号位。二进制的第一位,0 1不是符号位。
  char又叫做无符号的数据类型(没有符号位)。


8.打印9*9的乘法口诀表
  for(int i=1;i<9;i++){//外行控制行数
     for(int j=1;j<i;j++){
        System.out.println(j+"*"+i+"="+ j*i + " "); //换成"\t",相当于tab键。
   }
}
9.tab键对应字符 "\t"
10.数组的逆序
   前提:数组是从小到大排的
   概念:数组的元素,进行位置上的交换;逆序!=反向遍历
   比如:12345 逆序的实现思想:数组最远端位置的交换,通过索引(指针思想)
代码如下:
public static void main(String[] args){
int[] arr = {1,5,68,17};

//逆序前
printArray(arr);
reverse(arr);
//逆序后
printArray(arr);
}

//打印数组
public static void printArray(int[] arr){
System.out.print("[");
for(int i=0;i<arr.length;i++){
if(i==arr.length-1){
System.out.print(arr[i]+"]");
}else{
System.out.print(arr[i]+",");
}
}
}

//逆序,默认原先是123456这样按顺序排的
public static void reverse(int[] arr){
//数组遍历,最远端交换
for(int min=0,max = arr.length-1;min<max;min++,max-- ){

    int temp = arr[min];
    arr[min] = arr[max];
                arr[max] = temp;
}
}
11.静态方法不能调用非静态方法的原因
   1.静态方法优先于对象被创建


   2.非静态方法通过对象创建


   3.静态方法在内存中创建后,还没有创建对象,所以不能调用非静态方法和变量。


12.//null 类型调用静态方法,输出什么?
   public class Test{


private static void Print(){
System.out.println("Print()");
}


public static void main(String[] args) {


((Test)null).Print();


}


}


问输出什么?


//输出是Print()


    因为:1.Print()是静态方法,不用对象也可以调用,((Test)null).Print() 这种格式也可以。


          2.null 可以转换成任意引用类型


          3.((Test)null).Print() 相当于 Test t = null; t.Print();


          4.如果将Print()方法的修饰符去掉,执行时会报空指针异常,因为是在静态方法中调用非静态方法。


13.排序一般升序排列
14.选择排序和冒泡排序区别与使用
   
   选择排序:数组的每个元素都进行比较(拿1个数和其他所有数比,把小的数放前面)
   冒泡排序:数组中相邻元素进行比较 (第1个和第1个比,第2个和第3个比,大的跑到最后面)
   规则:比较大小,位置交换


   (1)选择排序:
        定义方法:实现数组的选择排序
        返回值:没有
        参数:数组
        实现步骤:
         1>.嵌套循环
            外循环,控制比较了多少次
            内循环,控制比较多少个元素
         2>.判断元素的大小值
            小值,存储到小的索引


代码如下:
    public static void main(String[] args){
int[] arr = {5,7,6,34,44,9,-4};
selectSort(arr);
printArray(arr);
}


    //选择排序
public static void selectSort(int[] arr){
//步骤:外层
for(int i=0;i<arr.length-1;i++){
for(int j=i+1;j<arr.length;j++){
if(arr[i] > arr[j]){
//换位置
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
}
}

//输出
public static void printArray(int[] arr){
System.out.print("[");
for(int i=0;i<arr.length;i++){
if(i==arr.length-1){
System.out.print(arr[i]+"]");
}else{
System.out.print(arr[i]+",");
}
}
}


      (2)冒泡排序
      public static void main(String[] args){
int[] arr = {5,6,1,7,3,0,-2};
bubbleSort(arr);
printArray(arr);
}

//冒泡排序
public static void bubbleSort(int[] arr){
for(int i=0;i<arr.length-1;i++){
for(int j=0;j<arr.length-i-1;j++){
//换位
if(arr[j] > arr[j+1]){
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}

//打印
public static void printArray(int[] arr){
System.out.print("[");
for(int i=0;i<arr.length;i++){
if(i==arr.length-1){
System.out.print(arr[i]+"]");
}else{
System.out.print(arr[i]+",");
}
}
}    
15.数组的折半查找
   前提:被查找的数组中的元素,必须有序排列


public static void main(String[] args){
int[] arr = {1,2,3,4,5,6,7};
int index = binarySearch(arr,7);
System.out.println(index);
}
//二分查找
/*
定义方法:实现折半查找
参数:数组,被查找的元素
返回值 索引
实现步骤:1.需要的变量定义
           三个指针
2.进行循环折半
   可以折半的条件 min《=max
3.让被找元素和中间索引元素进行比较
    元素>中间索引 小指针 = 中间+1
元素<中间索引 大指针 = 中间-1
元素 == 中间索引 找到了,结束了,返回中间索引
4.循环结束,无法折半
  元素没有找到,返回-1
*/
public static int binarySearch(int[] arr,int key ){
//1.定义3个变量
int min = 0;
int max = arr.length -1;
int mid = 0;
//循环折半,条件min<= max
while(min <= max){
//计算中间索引
mid = (min+max)/2;
if(key >arr[mid]){
min = mid + 1;
}else if(key < arr[mid]){
max = mid - 1;
}else{
//找到索引,返回元素索引
return mid;
}
}
return -1;
}
     


   
<think>好的,我现在需要帮用户解答关于Java数组逆序排序基础知识。用户之前已经询问过关于增强型for循环的问题,现在转而问数组逆序排序,可能是在学习数组操作的过程中遇到了新的需求。 首,我需要确定用户的基础水平。之前的问题是关于foreach循环,说明用户可能对数组的基本操作有一定了解,但可能还不熟悉更复杂的排序方法。逆序排序是一个常见的操作,但Java本身并没有直接提供逆序排序的方法,尤其是对于基本数据类型的数组,比如int数组。因此,我需要分情况讨论,包括基本类型和对象类型的不同处理方式。 接下来,我需要考虑用户可能的实际应用场景。用户可能有一个数组,需要将其元素从大到小排列,或者只是单纯地反转数组元素的顺序。这里要注意区分“排序”和“反转”的区别。排序是按照某种顺序(升序或降序)重新排列元素,而反转仅仅是颠倒元素的现有顺序。用户的问题提到的是逆序排序,所以我需要明确这两种操作的不同。 对于基本数据类型数组,比如int数组,Java的Arrays.sort()默认是升序排序,要实现逆序排序,可能需要手动反转数组,或者使用自定义的排序策略。而对于对象数组,比如Integer数组,可以使用Collections.reverseOrder()来作为比较器,但需要将数组转换为对象列表,或者使用流来处理。 然后,我需要检查是否有常见的错误或需要注意的地方。例如,基本类型数组无法直接使用Collections.reverseOrder(),必须手动处理。另外,在反转数组时,循环的索引应该到数组长度的一半,否则交换两次会导致恢复原状。同时,用户可能对自动装箱和拆箱不太熟悉,特别是在处理int和Integer之间的转换时,可能需要解释清楚。 用户可能的需求不仅仅是了解如何逆序排序,还可能想知道不同的实现方法及其优缺点。例如,手动反转数组的时间复杂度是O(n),而使用流API可能更简洁但性能稍差。此外,使用Arrays.sort结合反转的方法可能适用于升序再反转得到降序的情况。 我还需要考虑是否需要提供代码示例,因为用户之前的问题中包含了代码,所以提供示例会更有帮助。需要确保代码示例正确,并且注释清晰,说明每一步的作用。例如,手动反转数组的双指针方法,或者使用流处理的方式。 另外,可能需要指出Java 8引入的流和Lambda表达式,以及它们如何简化操作,但也要提醒用户注意性能问题,尤其是在处理大数据量时。对于二维数组或者更复杂的数据结构,可能需要不同的处理方法,但用户当前的问题可能集中在单层数组上,所以暂时不需要展开。 最后,总结不同方法的适用场景,帮助用户根据具体需求选择合适的方法。例如,如果只需要反转顺序,手动交换更高效;如果需要真正的降序排序,可以升序排序再反转,或者使用对象数组结合自定义比较器。</think>以下是Java数组逆序排序的详细解析: --- ### 一、核心概念区分 #### 1. 排序 vs 反转 - **排序**:根据元素大小重新排列(如升序`1,2,3`或降序`3,2,1`) - **反转**:仅颠倒元素顺序(如`[1,3,2]`→`[2,3,1]`) #### 2. 数据类型差异 | 数据类型 | 处理方式 | 示例数组 | |----------|----------------------------|---------------| | 基本类型 | 需手动实现反转或自定义排序逻辑 | `int[] arr` | | 对象类型 | 可直接使用`Collections`工具类 | `Integer[] arr` | --- ### 二、具体实现方案 #### 方案1:手动反转数组(通用) ```java public static void reverseArray(int[] arr) { for(int i=0; i<arr.length/2; i++) { // 只需遍历一半 int temp = arr[i]; arr[i] = arr[arr.length-1-i]; // 对称交换 arr[arr.length-1-i] = temp; } } // 使用示例 int[] scores = {88, 95, 70, 62}; reverseArray(scores); // 结果:[62,70,95,88] ``` **时间复杂度**:$O(n)$ #### 方案2:升序再反转(两步法) ```java int[] arr = {3,1,4,2}; // 升序排序 Arrays.sort(arr); // [1,2,3,4] // 反转数组 reverseArray(arr); // [4,3,2,1] ``` #### 方案3:对象数组专用(降序排序) ```java Integer[] arr = {3,1,4,2}; // 必须用包装类 Arrays.sort(arr, Collections.reverseOrder()); // 直接降序 [4,3,2,1] ``` #### 方案4:Java 8 Stream API(新特性) ```java int[] arr = {3,1,4,2}; int[] reversed = Arrays.stream(arr) .boxed() // 转为Stream<Integer> .sorted(Comparator.reverseOrder()) .mapToInt(Integer::intValue) .toArray(); // [4,3,2,1] ``` --- ### 三、数学表达排序过程 设原数组为$A = [a_0,a_1,...,a_{n-1}]$,降序排序后满足: $$ \forall i<j, \quad A'[i] \geq A'[j] $$ 标准库排序算法的时间复杂度一般为: $$ T(n) = O(n \log n) $$ --- ### 四、关键注意事项 1. **基本类型限制**:`Collections.reverseOrder()`仅适用于对象数组 ```java int[] arr = {1,2,3}; // 错误!无法直接使用 Integer[] arr = {1,2,3}; // 正确 ``` 2. **二维数组处理**: ```java int[][] matrix = {{3,1}, {2,4}}; Arrays.sort(matrix, (a,b) -> Integer.compare(b[0], a[0])); // 按首元素降序 ``` 3. **稳定性问题**:`Arrays.sort()`对对象数组使用归并排序(稳定),对基本类型使用快速排序(不稳定) --- ### 五、性能对比 | 方法 | 适用场景 | 时间复杂度 | 空间复杂度 | |--------------------|-----------------|------------|------------| | 手动反转 | 仅需反转顺序 | $O(n)$ | $O(1)$ | | 升序+反转 | 需要降序结果 | $O(n \log n)$ | $O(1)$ | | Collections工具类 | 对象数组降序 | $O(n \log n)$ | $O(\log n)$ | | Stream API | 链式处理 | $O(n \log n)$ | $O(n)$ | --- ### 六、最佳实践建议 1. **明确需求**:确认需要的是排序还是单纯反转 2. **数据量选择**: - 小数组(<1000元素):任意方法均可 - 大数组:优选择`Arrays.sort()`+反转 3. **代码可读性**:优使用标准库方法 ```java // 推荐写法(对象数组) Integer[] arr = {5,2,9,1}; Arrays.sort(arr, Collections.reverseOrder()); // 推荐写法(基本类型数组) int[] arr = {5,2,9,1}; Arrays.sort(arr); // 升序 [1,2,5,9] reverseArray(arr); // 反转得 [9,5,2,1] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值