剑指offer42--约瑟夫环和位移

来源:互联网 发布:太瘦了知乎 编辑:程序博客网 时间:2024/06/14 00:10

一、题目



题目:0, 1, … , n-1 这n个数字排成一个圈圈,从数字0开始每次从圆圏里删除第m个数字。求出这个圈圈里剩下的最后一个数字。



二、思想


(1)对链表进行初始化

(2)移动 m-1 次就可以移动到下一个要删除的元素上了

(3)将该元素删除



三、程序



package 剑指offer;import java.util.LinkedList;import java.util.List;/*题目:0, 1, … , n-1 这n个数字排成一个圈圈, *从数字0开始每次从圆圏里删除第m个数字。求出这个圈圈里剩下的最后一个数字。*/public class Test47 {// 从0--n-1排成一圈,依次剔除第m个数public static int lastNumber(int n, int m){List<Integer> list = new LinkedList<>();        for (int i = 0; i < n; i++) {            list.add(i);        }                // 要删除元素的位置        int index = 0;                        while (list.size() > 1) {            // 只要移动m-1次就可以移动到下一个要删除的元素上            for (int i = 1; i < m; i++) {                index = (index + 1) % list.size();            }            list.remove(index);        }        return list.get(0);}public static void main(String args[]){        System.out.println(lastNumber(5, 3)); // 最后余下3        System.out.println(lastNumber(5, 2)); // 最后余下2        }}


上面这个程序我想用数组来实现,但是老是有问题啊,不知道怎么回事


import java.util.List;/*题目:0, 1, … , n-1 这n个数字排成一个圈圈, *从数字0开始每次从圆圏里删除第m个数字。求出这个圈圈里剩下的最后一个数字。*/public class Test47 {// 从0--n-1排成一圈,依次剔除第m个数public static int lastNumber(int n, int m){List<Integer> list = new LinkedList<>();        for (int i = 0; i < n; i++) {            list.add(i);        }                // 要删除元素的位置        int index = 0;                        while (list.size() > 1) {            // 只要移动m-1次就可以移动到下一个要删除的元素上            for (int i = 1; i < m; i++) {                index = (index + 1) % list.size();            }            list.remove(index);        }        return list.get(0);}//// 1--n的n个数循环遍历//// 使用数组的方式//public static int lastNumber2(int n, int m){////// 边界条件//if(n <= 0 || m <= 0){//return 0;//}////// 创建一个长度为n+1的数组//int num[] = new int[n + 1];////for(int i = 1; i <= n; i++){//num[i] = i;//}////// 执行n-1次,每次将其中一个数置为0//int flag = 0;//// 其中flag是指对应数组的下标//for(int j = 1; j < n; j++){//for(int k = 0; k < m; k++){////flag++;////if(num[flag] == 0){//flag++;//}////if(flag > n){//flag = 1;//}//}//num[flag] = 0;//}////// 找到最后不为0的那个数//for(int i = 1; i <= n; i++){//if(num[i] != 0){//return num[i];//}//}//return 0;//}//public static void main(String args[]){        System.out.println(lastNumber(5, 3)); // 最后余下3        System.out.println(lastNumber(5, 2)); // 最后余下2        //        System.out.println(lastNumber2(5, 3)); // 最后余下3//        System.out.println(lastNumber2(5, 2)); // 最后余下2}}



四、位的操作



题目:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、×、÷四则运算符号。

package 剑指offer;/*题目:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、×、÷四则运算符号。*/public class Test48 {public static int myOperation(int number1, int number2){int sum = 0;int count = 0;do{// 将两个数进行异或sum = number1 ^ number2;// 将两个数位与,如果是两个1,那么就向前进一位count = (number1 & number2) << 1;number1 = sum;number2 = count;}while(number2 != 0);return number1;}    public static void main(String[] args) {        System.out.println(myOperation(1, 2) + " = " + (1 + 2));        System.out.println(myOperation(11, 22)+ " = " + (11 + 22));    }}




1 0
原创粉丝点击