PAT 数组元素右移问题 (Java实现+详细讲解)

题意:

       对输入内容进行右移操作(最后的值覆盖第一个值)

如:

        输入其中的"6"是下方数字的数量,”2“是位移的距离

        1 2 3 4 5 6===>5 6 1 2 3 4;(这里每一位都位移了两次)

        像输入: 7,3, 1 2 3 4 5 6 7 ===>5 6 7 1 2 3 4

所以便有一下逻辑:

        1.一次位移一格,共位移n次

        2.注意最后的值会覆盖第一个值

        3.需要保持记录要被覆盖的值

代码如下:

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int number = scanner.nextInt();//获取数字的数量
        
        int len = scanner.nextInt();//获取右移位数
        
        String s = scanner.next()+scanner.nextLine();//获取数字
        
        String[] values = s.split(" ");//按" ",分割成数组
        
        for(int a = 0 ;a<len;a++){//循环要右移的次数(因为这里是一次移动一格分成小部分来多次移动)
            
            String tip = "";//下文有详细讲(主要用来记录将被覆盖的值,方便接下来使用!)
            
            for(int b = 0 ;b<number;b++){//所有值进行一次位移
                
                if((b+1)!=number){//当不为最后一个数时.
                    
                    if(b==0){//为第一个数则记录第二个数,并以第一个的值覆盖第二个的值.
                        
                        tip = values[b+1];//记录
                        values[b+1] =values[b];//覆盖
                        
                    }else{//不是第一个时,记录后进行覆盖
                        
                        String temp = tip;//临时用来保存的值(因为这个象排序算法一样,只用两个值无法做到交换!!!)
                        tip = values[b+1];//记录
                        values[b+1] = temp;//覆盖
                        
                    }
                    
                }else{//当为最后一个值时,对第一个值进行覆盖即可
                    values[0] = tip;
                }
            }
        }
        for(int a = 0 ;a<number;a++){//打印内容
            System.out.print(values[a]+""+(((a+1)==number)?"\n":" "));
        }
        
    }
}

tip讲解:

        我们做排序算法交换数据时,只有两个变量交换是不够的,所以需要第三个临时变量来参与.

        而这里的tip作用就跟数据交换一样.当An要覆盖An+1的数时,如果没有记录An+1的值则会使得An+2没能给An+1原来的值覆盖,而是背An的值覆盖了

如图:

以上就是我所的理解方法,

感谢大家的阅读!!!

  • 13
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值