精华内容
下载资源
问答
  • 输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。...n-count 分别为2 2 1 当前的start为1,满足n - start == count 时 start向前一位,代表截取起始坐标前进位。 class Solution { StringBuilder res;...

    输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。

    0.法0:递归生成全排列,打印去0 ,比较容易理解(和法一比较一下)

    class Solution {
        StringBuilder str;
        int n;
        public void printNumbers(int n) {
            this.n =n;
            str = new StringBuilder();
            for(int i=0;i<n;i++){
                str.append('0');
            }
            dfs(0);
        }
        public void dfs(int k){
    
            if(k==n){
                printNum(str);   //填充完了  打印
                return;
            }
            for(int i=0;i<10;i++){
                str.replace(k,k+1,String.valueOf(i)); //第k位填充 0 1 2 3 ..9
                dfs(k+1);
            }
    
        }
        public  void printNum(StringBuilder str) {  //打印 去除0
            int index = 0;
            while (index<n && str.charAt(index) == '0')
                    index ++ ;
            if (index==n)   //全0 跳过
                return;
            System.out.print(str.substring(index)+" ");
        }
    
        public static void main(String[] args) {
            Solution s=new Solution();
            s.printNumbers(3);
        }
    }

     

    1、法一:递归生成全排列,通过n和9的个数之间的关系截取。

    比如说生成 ...097 098 099  ... 9的个数分别为 1 1 2  。n-count 分别为2 2 1  当前的start为1,满足n - start == count 时 start向前一位,代表截取起始坐标前进一位。

    class Solution {
        StringBuilder res;
        int   start, n;   //截取开始的位置
        char[] num, loop = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
        public String printNumbers(int n) {
            this.n = n;
            res = new StringBuilder();  //结果
            num = new char[n];          //n个字符
            start = n - 1;              //截取的起点 开始只有1位
            dfs(0,0);                 //递归遍历
            res.deleteCharAt(res.length() - 1); //删掉多余的,号
            return res.toString();
        }
        void dfs(int x,int count) {
            if(x == n) {                //比如说n=3 x代表下标 从0,1,2开始 到3结束递归
                //System.out.println(n+" "+String.valueOf(num)+" "+start+" "+count);
                String s = String.valueOf(num).substring(start);
                if(!s.equals("0")) res.append(s + ",");
                if(n - start == count) start--;        //如果9的个数到了 往前一位 如n=3 099 3-1 ==2
                return;
            }
            for(char i : loop) {
                num[x] = i;                   //递归赋值0...9
                if(i == '9') count++;         //9的个数+1
                dfs(x + 1,count);
            }
        }
    
        public static void main(String[] args){
            Solution s = new Solution();
            System.out.println(s.printNumbers(3));
        }
    }
    
    

    2、模拟大数加法。(推荐掌握)

    public class Solution {
        public String printNumbers(int n) {
            StringBuilder  res = new StringBuilder();
            StringBuilder str = new StringBuilder();
            // 将str初始化为n个'0'字符组成的字符串
            for (int i = 0; i < n; i++) {
                str.append('0');
            }
            while(!increment(str)){
                // 去掉左侧的0
                int index = 0;
                while (index < str.length() && str.charAt(index) == '0'){
                    index++;
                }
                res.append(str.substring(index)).append(",");
            }
            return res.substring(0,res.length()-1);
        }
    //    increment函数,若发生进位则一直进行for循环,直到不产生进位则break。如果i为0(即到了最高位)还发生了进位,
    //    则设置isOverflow为true,并返回至主函数的while判断
    //    str为全局变量,每次加1,不进位的话 就跳出,进位的话,赋0,i-1,下一层循环加1跳出, 下一次进入又从末位开始。
        public boolean increment(StringBuilder str) {
            boolean isOverflow = false;
            for (int i = str.length() - 1; i >= 0; i--) {
                char s = (char)(str.charAt(i) + 1);
    
                // 如果s大于'9'则发生进位
                if (s > '9') {
                    str.replace(i, i + 1, "0");
                    if (i == 0) {
                        isOverflow = true;
                    }
                }
                // 没发生进位则跳出for循环
                else {
                    str.replace(i, i + 1, String.valueOf(s));
                    break;
                }
    
            }
            return isOverflow;
        }
    
        public static void main(String[] args){
            Solution s = new Solution();
            String ss=s.printNumbers(3);
            System.out.println(ss);
        }
    }
    
    

     

    展开全文
  • 解题思路:我的做法是通过队列queue(保存...而指定的元素位置仍用m标识,每次移动m都向前挪动个。当队列中元素移除个时,最大元素就变了(通过v--来控制) #include#include#include#includeusing na

    解题思路:我的做法是通过队列queue(保存队列)和vector容器(通过sort完成从小到大的排序)完成,只有遇到队列中优先级最高(数字最大)才能移除队列,时间加1(total++);而指定的元素位置仍用m标识,每一次移动m都向前挪动一个。当队列中元素移除一个时,最大元素就变了(通过v--来控制)


    1. #include<cstdio>
    2. #include<queue>
    3. #include<vector>
    4. #include<algorithm>
    5. using namespace std;
    6.  queue<int>q;
    7.  vector<int>vec;
    8. int main(){
    9.     int T;
    10.     scanf("%d",&T);
    11.     while(T--){
    12.         int n,m;
    13.         scanf("%d%d",&n,&m);
    14.         for(int i=0;i<n;i++)
    15.         {
    16.             int temp;
    17.             scanf("%d",&temp);
    18.             q.push(temp);
    19.             vec.push_back(temp);
    20.         }
    21.         sort(vec.begin(),vec.end());
    22.         int v=n-1;                       //vec[v]表示最大元素
    23.         int total=0;
    24.         while(true){
    25.             int t=q.front();q.pop();                 //取出一个元素并暂时删除
    26.             if(m==0 && t>=vec[v]){
    27.                 total++;
    28.                 break;
    29.             }
    30.             else if(t>=vec[v]){                    //当取出的值大于当前最大值时,移除,同时m--;
    31.             total++;
    32.             m=(m-1+v+1)%(v+1);
    33.             v--;
    34.             }
    35.             else {
    36.                 q.push(t);
    37.                 m=(m-1+v+1)%(v+1);
    38.             }
    39.         }
    40.         printf("%d\n",total);
    41.         vec.clear();
    42.         while(true)if(!q.empty())q.pop();else break;              //最后别忘了清空容器
    43.     }
    44.     return 0;
    45. }

    解题思路:我的做法是通过队列queue(保存队列)和vector容器(通过sort完成从小到大的排序)完成,只有遇到队列中优先级最高(数字最大)才能移除队列,时间加1(total++);而指定的元素位置仍用m标识,每一次移动m都向前挪动一个。当队列中元素移除一个时,最大元素就变了(通过v--来控制)
    展开全文
  • :拒绝标签化很多人开始就会根据自己的弱点,给自己上各种各样的标签,然后就因为这些标签把自己局限住,不敢向前迈出一步。这里明确告诉你一点:其实刚开始学Java是不需要太高深的数学和英语基础。...

    “我成绩不好,能学好JAVA吗?”

    “我数学不好是不是代表逻辑思维不行?”

    “我英语都不及格,那么多单词我怎么记得住?”

    很多初学者在刚开始学习Java的时候,都会有这样的考虑,对于这个问题,我的看法是这样的。

    第一:拒绝标签化

    很多人一开始就会根据自己的弱点,给自己打上各种各样的标签,然后就因为这些标签把自己局限住,不敢向前迈出一步。这里明确告诉你一点:其实刚开始学Java是不需要太高深的数学和英语基础。

    1.初级阶段,就是刚开始学习编程,并不需要高深的数学,但逻辑要清楚。

    2.不需要太多英语,但了解些基本的单词对编程有好处,必要时也可以查外文文献。

    3.一个人不要随便地给自己贴标签,比如自己给自己贴上“数学和英语不好”这个标签,也许它符合你现在的情况,但并不等于你以后也是这种情况。

    Emma Mulqueeny(既是企业家又是程序员) 说:大多数情况下,很难的数学题(物理和几何)要么被计算机解答,要么被其他人解答。计算的过程确实是发生的,而且对于程序的运行至关重要,但是作为程序员,完全不需要知道这一切是怎么做到的。

    第二:兴趣是最好的老师

    “兴趣是最好的老师”!对于IT行业尤其受用。

    想要学好编程,首先要对编程非常感兴趣,然后去努力,学会编程并不是难事。

    针对初学者无论是学习Java还是学习其他编程语言,我有这些建议:

    1、从小程序入手。学习可以从编写一些具体的小的真正有点用的程序入手,需要用到数据结构与算法时,顺带着就学了,感兴趣的再深入系统地学一下。除非你在一些特定的有特殊要求的领域写程序,否则,大多数情况下用不上很高深的数学。

    2、去学习英语。建议你在有一定基础后,直接看一些英文版的教材和视频,开始会比较难,慢,但坚持下来,好处很多的,你既能学到了知识,又能提高英语水平。

    3、要多尝试,多动手。不能一味地停留在知识点掌握的程度上,踏实学习,多动脑多探索,多练代码慢慢就会有一个不错的水平!

    另外:既然知道自己的缺陷在哪,就应该每天去学习数学和英语,慢慢增进,与实际工作相结合。工作几年之后,你就肯定能脱颖而出,不偷懒就已经让你慢慢地超过许多人了。

    最后在这里给你推荐一下我的哔哩哔哩视频专栏:2020年最新Java基础精讲视频教程。 这套视频教程是我从去年年底到今年年初,根据市场技术栈需求录制的,非常系统完整,相信可以带你走进Java编程的世界。

    展开全文
  • Next Permutation 问题简介:给定个数组,...解释:可以倒序看给定数组,在数字3处遇见更小的数值2时,从数组末尾处向前个比2大的数字,即3,交换两个数字,这时数组为[1,3,4,2,0],然后在交换后的数字2处往后进...

    Next Permutation

    问题简介:给定一个数组,将数字重新排列到字典上的下一个更大的数字排列,当没有这种排列方式时,即将数组升序排列
    举例:
    1.
    给定数组[1,2,4,3,0]
    结果数组[1,3,0,2,4]
    解释:可以倒序看给定数组,在数字4处遇见更小的数值2时,从数组末尾处向前找打第一个比2大的数字,即3,交换两个数字,这时数组为[1,3,4,2,0],然后在交换后的数字2处往后进行反转,这时数组为[1,3,0,2,4]
    2.
    给定数组[5,4,3,1,0]
    结果数组[0,1,3,4,5]
    解释:当原数组为降序排列时,将数组反转即升序排列
    注:
    1.要求使用恒定的空间
    2.不需要返回值,结果即为原数组nums

    解法一:
    当数组只有0或一个元素时即不处理数组.将数组从后向前遍历,将当前索引i处数值与i-1处相比,当遇到小于当前值时,记录i,当i为0时即为降序排序只要反转数组即可,当i不为0时,进行处理,交换倒序第一个大于i-1处的值,从i处开始反转数组

    class Solution {
        public void nextPermutation(int[] nums) {
            int length = nums.length;
            if (length <= 1) return;
            int i = length - 1;
            for (i = length - 1; i > 0; i--) {
                if (nums[i] > nums[i - 1])
                    break;
            }
            int temp = 0;
            if (i == 0) {
                length--;
                while (i < length) {
                    temp = nums[length];
                    nums[length] = nums[i];
                    nums[i] = temp;
                    i++;
                    length--;
                }
            } else {
                temp = nums[i - 1];
                for (int j = length - 1; j >= i; j--) {
                    if (nums[j] > temp) {
                        nums[i - 1] = nums[j];
                        nums[j] = temp;
                        break;
                    }
                }
                length--;
                while (i < length) {
                    temp = nums[length];
                    nums[length] = nums[i];
                    nums[i] = temp;
                    i++;
                    length--;
                }
            }
        }
    }
    

    复杂度分析:
    时间复杂度:o(n)都是单层遍历
    空间复杂度:o(1)使用的恒定空间
    小白刷题之路,请多指教— — 要么大器晚成,要么石沉大海

    展开全文
  • 主要原因是工作时间事务繁杂,干扰太多,往往一通电话下来,刚才想做的什么就都忘了,而且其间还献过次血(400ml),所以难以静下心来,主要依靠在家里做完家务来写点东西,象今天这样的周末时间就很出活儿,坐...
  • 面试题31:栈的压入、弹出序列 输入两个整数序列,第个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹...用个栈模拟一下压入和弹出的过程,两个序列不同步地向前走,当压入后栈顶出现要弹出的元素时就...
  • 暴力方法解法二:借助哈希表,以空间换时间isValid(有效的括号)解法:栈removeElement(移除元素)解法:双指针遍历,头尾指针plusOne(加一)解法:从后向前遍历singleNumber(只出现次的数字)解法:...
  • SFX-bfxr.net [evolution.voxeo.com]字体-访客/ dafont.com图形和编码-Allan Grzicic v1.4.1.1 [Numbers 1.0](发布于2017年8月31日) )-字母更改为数字(从0-40开始向前和向后计数)v1.4.1.1 [英语字母1.1](2017...
  • 面试题21:包含min函数的栈:引入两个栈,个栈每次push实际的数字,另个minStack,如果push的数字小于minStack栈顶的数字,push新的数字,繁殖,把栈顶的数字再压入遍。 面试题22:栈的压入、弹出序列:建立...
  • 和为S的连续正数序列

    2016-07-11 22:18:00
    题目 输入个正整数S,打印出所有和为S的连续序列,...Big指针在前,当和小于target时继续向前增加数字;small在后,当和大于target时向前减少数字。边界条件:因为结果数组必须包含两个数字以上,所以small<(s+1)/
  • 回文是向后读取相同向前数字数字12321是典型的回文。 给定基数B(2 打印基数B和数字二。 程序名称:palsquare 输入格式 单行B,基数(在10中指定)。 输入(file palsquare.in) 10 输出格式 具有在...
  • 题目描述 输入个正数 s,打印出所有和为 s 的连续正数序列(至少含有两个数)。 基本思路 由于是连续数字序列,那么我们只需要知道序列的头和为就知道序列中所有的...当 curSum 小于 s 时,end 向前移动位,然后...
  • 第四个任务:8.10是个程序,该程序查找单词在向前和向后读取时是否相同。 如果是,它将打印回文。 如果不是,它将打印它不是回文。 第五个任务:9.10是个程序,该程序读取输入文件的名称,然后使用csv.reader...
  • Calendar类

    2017-05-03 16:28:41
    1) 在main()方法中,通过静态方法getInstance()创建个Calendar对象...3) 将Calendar对象表示的日期向前推1日,即1998年2月的最后天。4) 打印2月的最后天的数字,即1998年2月份的天数。package Chapter; import j
  •  直接插入排序用通俗的话讲,非常像扑克时摸牌与插牌的情形,如图1,如果此时摸到了一张7,自然会由后向前比较,比5大,继续比较,没有8大,就插在这里,直接插入排序的过程就是摸牌与插牌的过程,思想很简单,...
  • 系列给定数字插入个初始为空的小顶堆H[]。随后对任意给定的下标i,打印从H[i]到根结点的路径。 思路: 从当前的下标开始向前(堆顶)进行比较,如果上层的值大于当前的值,就将上层的值移动到当前的位置...
  • 回文检查器-源码

    2021-02-26 00:05:59
    个单词,词组,数字或其他顺序向后或向前读取的字符。 可以对大写字母,标点符号和单词分隔符进行调整。 著名的例子包括“个人,个计划,条运河,巴拿马!”,“阿莫尔,罗马”,“赛车”,“炸玉米饼”和...
  • 顾名思义,插入排序就是首先在待排序的数组中挑选出个数,然后向前看,找到它所在的合适位置,将该位置后面的数都后移次,再将选取的数插进去就行。其原理就跟咱们扑克插牌是一样的。 以下面五个无序的数字为...
  • 我试图向前馈送反向传播,但是在网络训练之后,当模拟和打印模拟输出时,我看不到任何靠近目标的值,但它只是数字。代码如下。什么是错,什么是问题?前馈反向传播:>> load('E:/Inputdata.txt');>>...
  • javascript入门笔记

    2018-05-15 15:01:07
    特点 :将 a 和 b 转换为 二进制,按位比较,对应位置的数字,至少有位为1的话,那么该为的整体结果就为1,否则为 0 ex : 5 | 3 101 011 ======== 111 结果为 :7 适用场合:任何小数与0 做 按位或的操作...
  • 数字进行取LCM的时候,可能会爆int 结构体注意初始化问题,不要以为默认会被初始化为0,最好手写构造函数 ~是按位取反,只需要把位取反的时候不要用 线段树区间更新时updata忘记加lazy标记 输出结果的时候...
  • 剑指offer--面试题12

    2013-08-11 09:50:00
     刚开始纠结于字符串怎么加1,想了片刻,觉得应该取出最后位上的字符,转成数字+1再转成字符,但这就出现个问题:'9'加1后得到'10',这会产生进位。。。  到这思维就乱了。。。1、不断向前进位怎么解决?2、...
  • 在排序中可以改变缺省的数字,使之向前或向后排。最后点击“保存”按钮,保存新页面信息。  3、双击左侧列表中新增的“督办通知单”,详细设置每个单元格内容。方法是使用直尺量出单元格的高度和宽度,填入单元格...
  • 在学习的路上,我们不仅要大步向前走,还要常回头看看,夯实夯实我们的基础,下面是 10 道 python 基础习题:...输入行字符,分别统计出其中英文字母、空格、数字和其它字符的个数;# 求s=a+aa+aaa+aaaa+aa...a的...
  • 将超声波传感器安放在头部眼眶中,trigger_pin接控制器数字口12和echo_pin 接主控器数字口3 。VVC和GND接主控板+5V和GND 9.避障行走 烧录下列代码可实现其避障行走(icbob_walk_avoid_turn) 演示视频:
  • 3.5.6 EOMONTH——计算从指定日期向前或向后几个月后的那个月最后天的日期 140 3.5.7 NETWORKDAYS——计算日期间的所有工作日数 141 3.5.8 NETWORKDAYS.INTL——计算日期间的所有工作日数,使用参数指明周末的...
  • 达内 coreJava 习题答案

    2010-02-10 19:49:01
    6、输出所有的水仙花数,把谓水仙花数是指个数3位数,其各各位数字立方和等于其本身, 例如: 153 = 1*1*1 + 3*3*3 + 5*5*5 class DafodilNumber{ public static void main(String[] args){ System.out....
  • 使用PageUP键和PageDown键,向前向后翻页。 . 按C键,返回目录页。 可返回刚才看过的目录页。 . (COOL)直接输入正文页码跳转到指定页。当打开图书后直接输入数字键,可跳转到输 入的页码。 <br> 7) ...
  • linux vi 常用命令

    2012-09-18 12:55:47
    B) 跳到文件中的某行 「#」:「#」号表示数字,在冒号后输入数字,再按回车键就会跳到该行了,如输入数字15,再回车,就会跳到文章的第15行。 C) 查找字符 「/关键字」:先按「/」键,再输入您想寻找的...

空空如也

空空如也

1 2 3
收藏数 49
精华内容 19
关键字:

向前打一数字