/**
* Author: yiminghe
* Date: 2008-10-29
* Time: 22:55:06
*/
import java.util.Arrays;
/**
* 将数组的前K个数和后n-k个数交换位置
* 如 1,2,3,4,5,6
* k=4
* 得到
* 5,6 ,1,2,3,4
*/
public class SwapMore {
private static void swap(int[] array, int a1, int a2) {
int t = array[a1];
array[a1] = array[a2];
array[a2] = t;
}
/**
* 最笨的方法 循环移位
*
* @param array
* @param k
*/
public static void swaps(int[] array, int k) {
if (array.length <= k) return;
while (k > 0) {
int t = array[0];
for (int i = 0; i < array.length - 1; i++) {
array[i] = array[i + 1];
}
array[array.length - 1] = t;
k--;
}
}
private static void reverse(int[] array, int start, int end) {
while (start < end) {
swap(array, start, end);
start++;
end--;
}
}
/**
* 好点的方法:
* uv -> vu
* vu=((u_) (v_) ) _
* u_表示 u数组的倒序
*
* @param array
* @param k
*/
public static void swaps2(int[] array, int k) {
reverse(array, 0, k - 1);
reverse(array, k, array.length - 1);
reverse(array, 0, array.length - 1);
}
private static int gcd(int a1, int a2) {
if (a1 < a2) {
int t = a1;
a1 = a2;
a2 = t;
}
if (a1 % a2 == 0)
return a2;
return gcd(a2, a1 % a2);
}
/**
* 最好的方法 ,利用数学 。。。。
* 最大公因式
* 没必要全部当做一个环循环移位
* 有几个环 ,对每个环移位,直接移到位
* 环的个数等于 gcd(k, array.length - k)=gcd(k, array.length)
*
*
* @param array
* @param k
*/
public static void swaps3(int[] array, int k) {
int loop = gcd(k, array.length - k);
for (int i = 0; i < loop; i++) {
System.out.println(Arrays.toString(array));
int t = array[i];
int p = i;
int j = (i + k) % array.length;
while (i != j) {
array[p] = array[j];
p = j;
j = (p + k) % array.length;
System.out.println("---" + Arrays.toString(array));
}
array[p] = t;
}
}
public static void main(String[] ars) {
int[] a = {1, 2, 3, 4, 5, 6, 7};
swaps3(a, 3);
System.out.println(Arrays.toString(a));
}
}
附:辗转相除法证明:
z 是 a,b的约数
a/z==0 b/z==0
则 (a%b)/z ==0
则 a,b约数 与 a,a%b约数相同 (a>b)
若 a%b==0 则 b 就是 a,b 的最大公约数
则辗转相除法得证
分享到:
相关推荐
// 定义双指针,i指向子数组a[0:k]的末尾,j指向子数组a[k+1:n-1]的起始 int i = k, j = array.length - 1; // 当i小于j时,继续交换元素 while (i ) { // 交换a[i]和a[j] int temp = array[i]; array[i] = ...
试设计一个算法将子数组a[0:k]与a[k+1,n-1]换位。要求算法在最坏情况下耗时O(n),且只用到O(1)的辅助空间。 2.在一个圆形操场的四周摆放着n堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的2堆石子合并...
以上是根据题目内容总结的五个核心知识点,包括二叉查找树转双向链表、寻找多个排序数组的公共元素、判断单链表环、换位字符串的识别以及数组中第k小元素的求解。这些知识点涵盖了数据结构、算法以及字符串处理等...
- 对左右两个子数组递归执行相同的操作,直到所有子数组都只包含一个元素为止。 #### 凑算式问题 - **问题描述**:给定几个数字和运算符,构造一个等式使得结果等于给定的目标值。 - **解题思路**: - 使用回溯...
4. 当 root node 出队(删除)后,last node 成为新的根节点,如果 last node 已经是其子节点中最大或最小的,则不需要向下换位;反之,如果 last node 不满足堆序性质,需要不断换位直到最底层,确保堆的性质。 5....
例如,可能有一个名为`encrypt`的函数用于加密,它接受一个二维字符数组表示的明文矩阵,然后返回一个新的矩阵作为加密后的结果。同样,`decrypt`函数接收加密后的矩阵,返回解密后的明文矩阵。 `实验1 古典密码学....
实现分组的一种方法是使用二维数组,其中每个子数组代表一个分组。这样,可以将一个长字符串分割成多个固定长度的子串,每个子串填充到对应的二维数组行中。 2. 秘钥定义: 秘钥在置换密码中起到至关重要的作用,...
4. **16轮迭代**:每一轮都包括子密钥生成、异或操作、函数F和换位操作。 - 子密钥生成:根据当前轮数和扩展后的密钥,进行特定的循环左移和查找S盒操作,生成48位的子密钥。 - 异或操作:R与子密钥进行异或,得到...
:Transpose置(用于字符数组转置) :TransposeWords (用于单词数组换位), :TransposeTab (用于制表符分隔的表格换位), :TransposeCSV (用于常规定界文本换位),以及 :TransposeInteractive (用于自定义...
最后,样式部分主要定义了容器和子元素的基本样式,包括容器的位置、尺寸以及布局方式。此外,还设置了元素的过渡效果,这通常涉及到Vue的过渡系统,可以通过过渡类名来控制元素在位置变更时的过渡动画。 总结来说...
每轮中,密钥都要经过PC-2、C换位和P置换等操作,产生48位的子密钥,总共产生16个子密钥。 2. **初始置换(IP)**:输入的64位数据先经过初始置换,改变数据的排列顺序,以便后续处理。 3. **Feistel网络**:DES的...
在编程时,你需要创建一个二维数组并按照特定规则读取。 3. **维吉尼亚密码**:是一种多密钥系统,结合了替换和换位密码。Delphi程序可以实现密钥生成、替换表创建以及字符的加密和解密。 4. **古典密码机**:如...
2.7.9 获取右子树 64 2.7.10 判断空树 65 2.7.11 计算二叉树深度 65 2.7.12 清空二叉树 65 2.7.13 显示结点数据 66 2.7.14 遍历二叉树 66 2.7.15 树结构操作示例 68 2.8 图结构 71 2.8.1 什么是图结构 71 ...
根节点在数组中的位置是 0,第 n 个位置的子节点分别在 2n+1 和 2n+2;位置 k 的叶子的父节点位置为(k-1)/2。 下面是 Java 实现最小二叉树堆排序的实例代码: ```java private int[] getMinBinaryHeap(int[] ...
3. 王车易位:在没有吃过子、将军、被将军或国王移动过的条件下,国王可以与一侧的车进行一次换位,称为短易位或长易位。 4. 仕(士)象(相):在JavaScript实现中,中国象棋中的仕(士)和象(相)可以参考国际...