lc day31

数学问题,今天没有耐心做题。。

剑指 Offer 14- II. 剪绳子 II

思路:之前做过一道题是分成3越多越好,这里类似,但要考虑4 的问题

public int cuttingRope(int n) {
        if(n == 2 || n==3)
            return n-1;
        long sum = 1;
        while (n>4){
            sum *= 3;
            sum = sum%1000000007;
            n -= 3;
        }
        return (int)(sum*n%1000000007);
    }

剑指 Offer 43. 1~n 整数中 1 出现的次数

思路:自己有点缕不明白,看了评论区有点明白了。注意考虑当前位置=1、>1、<1三种情况

//以 3 1 0 1 5 9 2 举例

    /*
     *计算从1-n出现1的总次数
     *就是计算1-n所有整数 个位+十位+百位+..为1的总和

     *下面三个例子,分别对应的位元素 大于1,等于1,等于0 三种情况

     *例一:把百位的5固定 3101 5 92
     *  我们把百位设为1,5前面可以取0-3101,5后面可以取0-99
     *  共有(3101 + 1)* 100(规律是百位即99 + 1)种组合使百位为1
     *
     *例二:把千位的1固定 310 1 592
     *  我们把千位设为1,这里可以分两种情况:
     *  当1前面取310,1后面可以取0-592
     *  当1前面可以取0-309,1后面可以取0-999
     *  共有(309 + 1)* 1000(规律是千位即999 + 1)+(592 + 1)种组合使千位为1

     *例三:把万位的0固定 31 0 1592
     *  把万位设为1, 0前面可以取0-30,0后面可以取0-9999
     *  共有(30 + 1)* 10000(规律是万位即9999 + 1)种组合使万位为1
     
     *我们可以分别计算一个数的个位百位...对应的组合数,最后相加
    */

 

 public int countDigitOne(int n) {
        long base = 1;
        int count = 0;
        while (base <= n){
            int low = (int)(n%base);
            int high = (int) (n/base);
            int cur = high%10;
            high /= 10;
            if (cur > 1){
                count += (high+1)*base;
            }else if (cur == 1){
                count += high*base +(low+1);
            }else {
                count += high*base;
            }
            base *= 10;
        }
        return count;
    }

剑指 Offer 44. 数字序列中某一位的数字

思路:没耐心好好看,改天看

 数字范围    数量  位数    占多少位
    1-9        9      1       9
    10-99      90     2       180
    100-999    900    3       2700
    1000-9999  9000   4       36000  ...

    例如 2901 = 9 + 180 + 2700 + 12 即一定是4位数,第12位   n = 12;
    数据为 = 1000 + (12 - 1)/ 4  = 1000 + 2 = 1002
    定位1002中的位置 = (n - 1) %  4 = 3    s.charAt(3) = 2;
 public int findNthDigit(int n) {
        int digit = 1;   // n所在数字的位数
        long start = 1;  // 数字范围开始的第一个数
        long count = 9;  // 占多少位
        while(n > count){
            n -= count;
            digit++;
            start *= 10;
            count = digit * start * 9;
        }
        long num = start + (n - 1) / digit;
        return Long.toString(num).charAt((n - 1) % digit) - '0';
    }

 

### 关于通达信 lc_data 使用方法、数据获取及处理 #### 1. Python 中使用 Pandas 获取并处理通达信历史日线数据 对于通达信的历史日线数据,可以利用 `pandas` 库中的 `read_csv()` 方法快速读取文件。这种方法不仅提高了效率,还简化了操作流程[^1]。 ```python import pandas as pd # 假设 CSV 文件路径如下 file_path = 'path_to_tdx_history.csv' # 加载CSV文件到DataFrame对象中 df = pd.read_csv(file_path) # 显示前几行记录以便确认加载成功与否 print(df.head()) ``` #### 2. 利用 Tushare 接口包获取更便捷的股票数据访问途径 除了直接从本地读取外,还可以借助第三方库如Tushare来实现更加灵活高效的股市行情抓取功能。这种方式能够提供更为丰富的API支持以及更好的用户体验[^2]。 ```python from tushare import pro_api token = "your_token_here" pro = pro_api(token) # 查询指定日期范围内的每日交易详情 data = pro.daily(ts_code='000001.SZ', start_date='20230101', end_date='20231231') ``` #### 3. 解析通达信原始二进制格式的日K线数据结构 当涉及到具体的技术细节时,则需参照官方文档或其他权威资料了解其内部存储机制。例如,在Java环境下可以通过字节流的方式逐位解析出每条记录的具体字段值[^4]。 ```csharp // 下面这段代码展示了如何解码一个典型的通达信DAY级别数据项 var item = new StockDayData(); item.DataDate = DateTime.Parse(new string(br.ReadChars(8))); var dateInt = br.ReadInt32(); var year = dateInt / 10000; var month = int.Parse(dateInt.ToString().Substring(4, 2)); var day = int.Parse(dateInt.ToString().Substring(6, 2)); item.OpenPrice = br.ReadInt32() * 0.01f; item.HighPrice = br.ReadInt32() * 0.01f; item.LowPrice = br.ReadInt32() * 0.01f; item.ClosePrice = br.ReadInt32() * 0.01f; Console.WriteLine($"Date:{new DateTime(year, month, day)}, Open={item.OpenPrice}, High={item.HighPrice}, Low={item.LowPrice}, Close={item.ClosePrice}"); ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值