不包含本位置值的累乘数组

【题目】

给定一个整型数组arr,返回不包含本位置值的累乘数组
例如,arr=[2,3,1,4],返回[12,8,24,6]

【要求】

时间复杂度为O(N),除需要返回的结果数组外,额外空间复杂度为O(1)

【进阶题目】

要求不变,而且不可以使用除法

【代码】

public class demo {
    public static void main(String[] args) {
        int[] arr={2,3,1,4};
        int[] res=plus3(arr);
        for(int i:res){
            System.out.println(i);//12,8,24,6
        }
    } 

    //不包含本位置值的累乘数组
    public static int[] plus(int[] arr){
        if(arr==null||arr.length==0){
            return null;
        }
        int count=0;//用除法要考虑数0的个数!
        int total=1;//总乘积
        for(int i=0;i<arr.length;i++){
            if(arr[i]!=0){
                total*=arr[i];
            }
            else{
                count++;
            }   
        }
        int[] res=new int[arr.length];
        //情况1:没有一个0
        if(count==0){
            for(int i=0;i<arr.length;i++){
            res[i]=total/arr[i];
        }
        }
        //情况2:有一个0,则该元素上的res[i]为total,其他位置是0
        if(count ==1){
            for(int i=0;i<arr.length;i++){
                if(arr[i]==0){
                    res[i]=total;
                }
            }
        }
        //情况3:不止一个0,则全部元素都为0,即不赋值即可
            return res; 
    }

    // 不包含本位置值的累乘数组
    public static int[] plus2(int[] arr) {
        if (arr == null || arr.length == 0) {
            return null;
        }
        int[] res = new int[arr.length];
        int[] arr2 = new int[2 * arr.length];
        // 拼接数组,res[i]就是后面几个元素的乘积,但额外空间复杂度不满足要求
        for (int i = 0; i < arr.length; i++) {
            arr2[i] = arr[i];
        }
        for (int i = 0; i < arr.length; i++) {
            arr2[arr.length + i] = arr[i];
        }
        int total = 1;
        for (int i = 0; i < arr.length; i++) {
            int count = arr.length - 1;
            int j = i + 1;
            res[i] = 1;
            while (count-- != 0) {
                res[i] *= arr2[j++];
            }
        }
        return res;
    }
// 不包含本位置值的累乘数组
    public static int[] plus3(int[] arr) {
        if (arr == null || arr.length == 0) {
            return null;
        }
        int[] res = new int[arr.length];
        // res[i]就是左边的累积*右边的累积
        res[0]=arr[0];
        //左边的累积:lr[i]=arr[0...i]的累积,用res作辅助数组
        for (int i = 1; i < arr.length; i++) {
            res[i] = res[i-1] * arr[i];
        }
        int temp=1;
        //右边的累积:rl[i]=arr[i...N-1]的累积,存到temp
        //调整res为结果输出
        for (int i = arr.length-1; i >0; i--) {
            res[i] = res[i - 1] * temp;
            //第一次:res[N-1]=lr[N-2]
            temp*=arr[i];//右边的累积
        }
        res[0]=temp;//res[0]=rl[1]
        return res;
    }
标题基于Python的汽车之家网站舆情分析系统研究AI更换标题第1章引言阐述汽车之家网站舆情分析的研究背景、意义、国内外研究现状、论文方法及创新点。1.1研究背景与意义说明汽车之家网站舆情分析对汽车行业及消费者的重要性。1.2国内外研究现状概述国内外在汽车舆情分析领域的研究进展与成果。1.3论文方法及创新点介绍本文采用的研究方法及相较于前人的创新之处。第2章相关理论总结和评述舆情分析、Python编程及网络爬虫相关理论。2.1舆情分析理论阐述舆情分析的基本概念、流程及关键技术。2.2Python编程基础介绍Python语言特点及其在数据分析中的应用。2.3网络爬虫技术说明网络爬虫的原理及在舆情数据收集中的应用。第3章系统设计详细描述基于Python的汽车之家网站舆情分析系统的设计方案。3.1系统架构设计给出系统的整体架构,包括数据收集、处理、分析及展示模块。3.2数据收集模块设计介绍如何利用网络爬虫技术收集汽车之家网站的舆情数据。3.3数据处理与分析模块设计阐述数据处理流程及舆情分析算法的选择与实现。第4章系统实现与测试介绍系统的实现过程及测试方法,确保系统稳定可靠。4.1系统实现环境列出系统实现所需的软件、硬件环境及开发工具。4.2系统实现过程详细描述系统各模块的实现步骤及代码实现细节。4.3系统测试方法介绍系统测试的方法、测试用例及测试结果分析。第5章研究结果与分析呈现系统运行结果,分析舆情数据,提出见解。5.1舆情数据可视化展示通过图表等形式展示舆情数据的分布、趋势等特征。5.2舆情分析结果解读对舆情分析结果进行解读,提出对汽车行业的见解。5.3对比方法分析将本系统与其他舆情分析系统进行对比,分析优劣。第6章结论与展望总结研究成果,提出未来研究方向。6.1研究结论概括本文的主要研究成果及对汽车之家网站舆情分析的贡献。6.2展望指出系统存在的足及未来改进方向,展望舆情
<think>好的,我现在需要帮用户找到涉及数组和指针的C语言循环经典题目。用户之前已经给出了一些包含数组的例子,现在明确要求排除数组和指针,所以我得仔细回忆常见的循环题目,并确保它们使用这两种结构。 首先,用户之前的问题是关于C语言循环的经典题及答案,但之前的回答中包含数组的例子,比如斐波那契数列、数组合并等。现在用户希望涉及数组和指针,所以需要调整方向。 常见的循环题目有哪些涉及数组和指针的呢?比如计算阶、判断素数、打印图形、最大公约数、数字分解等。这些题目通常只使用基本变量和循环结构,需要数组或指针。 接下来,我需要确认每个题目是否真的涉及数组或指针。例如,斐波那契数列如果数组存储,可以用三个变量交替计算,这样就能避免数组。同样,水仙花数、完数等数学问题通常需要数组。 还要注意用户可能需要同循环结构的例子,比如for、while、do-while,以及嵌套循环的应用,比如打印金字塔或法表。这些都是经典题目,且涉及数组或指针。 另外,用户可能希望题目涵盖同的难度层次,从基础到进阶,比如从简单的加到更复杂的条件判断循环。需要确保每个例子都清晰展示循环的使用,同时避免任何数组或指针的使用。 最后,检查是否有遗漏的经典题目,例如计算调和级数、判断回文数(使用数组的话,可以通过数字反转来实现),这些都可以用循环解决,无需数组或指针。 总结下来,我需要整理出约5-6个涉及数组和指针的循环题目,涵盖同的应用场景和循环结构,确保每个例子都有代码实现和简要说明,并生成相关问题供用户进一步学习。</think>### C语言经典循环题目(涉及数组和指针) #### 题目1:计算阶(`for`循环) 输入正整数$n$,输出$n!$的(如$5! = 120$)。 ```c #include <stdio.h> int main() { int n, result = 1; scanf("%d", &n); for (int i = 1; i <= n; i++) { result *= i; } printf("%d! = %d", n, result); return 0; } ``` **解析**:通过`for`循环实现阶计算,仅用基本变量存储结果[^1]。 --- #### 题目2:判断素数(`while`循环) 输入正整数$n$,判断其是否为素数(只能被1和自身整除)。 ```c #include <stdio.h> int main() { int n, i = 2, flag = 1; scanf("%d", &n); while (i <= n/2) { // 只需检查到n/2即可 if (n % i == 0) { flag = 0; break; } i++; } printf("%s素数", flag ? "是" : "是"); return 0; } ``` **解析**:利用`while`循环遍历可能的因数,通过`flag`标记判断结果[^2]。 --- #### 题目3:打印数字金字塔(嵌套`for`循环) 输入层数$n$,输出如下数字金字塔(示例$n=5$): ``` 1 121 12321 1234321 123454321 ``` ```c #include <stdio.h> int main() { int n; scanf("%d", &n); for (int i = 1; i <= n; i++) { // 打印左侧空格 for (int j = 1; j <= n - i; j++) { printf(" "); } // 左半部分递增 for (int k = 1; k <= i; k++) { printf("%d", k); } // 右半部分递减 for (int m = i - 1; m >= 1; m--) { printf("%d", m); } printf("\n"); } return 0; } ``` **解析**:通过三重嵌套循环分别处理空格、递增数字和递减数字的打印[^3]。 --- #### 题目4:求最大公约数(辗转相除法) 输入两个正整数$a$和$b$,用循环求其最大公约数。 ```c #include <stdio.h> int main() { int a, b, temp; scanf("%d %d", &a, &b); while (b != 0) { // 辗转相除法 temp = a % b; a = b; b = temp; } printf("最大公约数:%d", a); return 0; } ``` **解析**:利用`while`循环和变量交换实现欧几里得算法,无需数组存储中间结果[^1]。 --- #### 题目5:分解整数各位数字(`do-while`循环) 输入任意正整数,逆序输出其各位数字(如输入`1234`,输出`4 3 2 1`)。 ```c #include <stdio.h> int main() { int num, digit; scanf("%d", &num); do { digit = num % 10; // 取末位 printf("%d ", digit); num /= 10; // 移除末位 } while (num > 0); return 0; } ``` **解析**:使用`do-while`确保至少执行一次循环,避免对`0`输入的特殊处理[^2]。 --- ### 相关问题 1. **如何优化素数判断算法的效率**? (提示:检查范围可缩小至$\sqrt{n}$,跳过偶数) 2. **能否用`for`循环改写辗转相除法**?两者的性能差异是什么? 3. **数字金字塔题目中,如何修改代码使其输出字母金字塔**? 4. **阶计算时如何处理大数溢出问题**? 5. **如何用循环实现十进制转二进制**?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值