/**
* 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堆石子合并...
二分查找是基于分治法的原理,通过比较数组中间元素和目标值来决定是继续在左子数组还是右子数组中查找目标值。由于其时间复杂度为O(logn),理论上比线性搜索的O(n)要高效很多。然而,实现细节稍有不慎便容易导致...
以上是根据题目内容总结的五个核心知识点,包括二叉查找树转双向链表、寻找多个排序数组的公共元素、判断单链表环、换位字符串的识别以及数组中第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实现中,中国象棋中的仕(士)和象(相)可以参考国际...